【发布时间】:2019-11-14 15:33:58
【问题描述】:
我有一个包含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 用户控件相当简单。它订阅了 selection changed 事件,并定义了一些模板(与这个问题无关,所以把它们放在问题中)
<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 绑定得到通知,并更新视图模型。但这永远不会发生。
我对此一无所知,非常感谢您的帮助。
【问题讨论】:
标签: wpf dependency-properties caliburn