我有一个具有多个树视图和一个propertygrid的应用程序(来自扩展的 WPF工具包).目标是显示所选项目的属性.我是WPF的新手,所以我从一个树视图开始,并像这样绑定propertygrids选择的对象
<xctk:PropertyGrid x:Name="xctkPropertyGrid"
Grid.Column="2"
ShowSearchBox="False"
ShowSortOptions="False"
SelectedObject="{Binding ElementName=actionsTreeView, Path=SelectedItem, Mode=OneWay}">
</xctk:PropertyGrid>
这似乎工作正常.但它当然会一直绑定到actionsTreeView.当焦点更改为另一个树视图中的另一个选定项时,我真正需要的是更新该属性网格.我已经使用每个树视图的SelectedItemChanged实现了我的目标,并像这样设置了propertygrids selectedobject.这是否可能使用数据绑定和触发器.我的解决方案增加了一些代码和紧密耦合,并且感觉不是很MVVM.
亲切的问候,
杰夫
最佳答案 好的,这是我最终解决问题的方法:
每个树视图都绑定到主视图模型上的viemodel属性.我还在主视图模型上创建了一个SelectedItem属性,像这样绑定了propertygrid的SelectedObject:
private object selectedItem;
public object SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
OnPropertyChanged("SelectedItem");
}
}
然后,我将一个行为附加到每个更新此SelectedItem的树视图:
public class UpdateSelectedItemBehavior : Behavior<TreeView>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.GotFocus += AssociatedObject_GotFocus;
this.AssociatedObject.SelectedItemChanged += AssociatedObject_SelectedItemChanged;
}
void AssociatedObject_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
ViewModels.MainViewModel mainViewModel = AssociatedObject.DataContext as ViewModels.MainViewModel;
if (mainViewModel != null)
{
mainViewModel.SelectedItem = AssociatedObject.SelectedItem;
}
}
void AssociatedObject_GotFocus(object sender, RoutedEventArgs e)
{
ViewModels.MainViewModel mainViewModel = AssociatedObject.DataContext as ViewModels.MainViewModel;
if (mainViewModel != null)
{
mainViewModel.SelectedItem = AssociatedObject.SelectedItem;
}
}
}