我有一个包装了TreeView
的视图,称为MbiTreeView
。我想从视图模型的(包装)树视图中获取选定的项目。
使用此自定义用户控件的“父”用户控件:
<UserControl [...]>
<views:MbiTreeView
Grid.Row="0"
cal:Bind.Model="{Binding TreeViewModel}"
SelectedItem="{Binding SelectedItem}">
</views:MbiTreeView>
</UserControl>
父用户控件绑定到此视图模型:
internal sealed class SomeViewModel : PropertyChangedBase
{
public object SelectedItem
{
get => _selectedItem;
set
{
_selectedItem = value;
NotifyOfPropertyChange(() => SelectedItem);
}
}
public IMbiTreeViewModel TreeViewModel { get; }
public SomeViewModel(
IMbiTreeViewModel treeViewModel)
{
TreeViewModel = treeViewModel;
}
}
MbiTreeView用户控件相当简单。它订阅选择更改事件,并定义一些模板(与该问题无关,因此将其保留在问题中)
<TreeView ItemsSource="{Binding Items}" SelectedItemChanged="TreeView_OnSelectedItemChanged">
iew.ItemContainerStyle>
后面的代码声明依赖项属性:
public partial class MbiTreeView
{
public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(
nameof(SelectedItem),
typeof(object),
typeof(MbiTreeView),
null);
public object SelectedItem
{
get => GetValue(SelectedItemProperty);
set => SetValue(SelectedItemProperty, value);
}
public MbiTreeView()
{
InitializeComponent();
}
private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
SelectedItem = e.NewValue;
}
}
启动应用程序时,我可以浏览树视图项目。当我单击一个树视图节点时,会触发OnSelectedItemChanged
事件(我进入那里的断点)。这样,一切都会顺利进行,直到在依赖项属性SelectedItem
中设置值为止。
然后,我希望xaml绑定得到通知,并更新视图模型。但这永远不会发生。
我对此一无所知,我们非常感谢您的帮助。
SelectedItem绑定应为双向:
SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
您可以声明如下所示的属性以默认情况下绑定TwoWay。
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.Register(
nameof(SelectedItem),
typeof(object),
typeof(MbiTreeView),
new FrameworkPropertyMetadata(
null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));