【发布时间】:2014-04-15 16:38:23
【问题描述】:
我正在努力解决 WPF DependencyProperty / ViewModel 绑定问题。
我有这个类作为树视图的帮助类:
public class TreeViewHelper : DependencyObject
{
private static readonly Dictionary<DependencyObject, TreeViewSelectedItemBehavior> Behaviors = new Dictionary<DependencyObject, TreeViewSelectedItemBehavior>();
public static object GetSelectedItem(DependencyObject obj)
{
return obj.GetValue(SelectedItemProperty);
}
public static void SetSelectedItem(DependencyObject obj, object value)
{
obj.SetValue(SelectedItemProperty, value);
}
// Using a DependencyProperty as the backing store for SelectedItem. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(TreeViewHelper), new UIPropertyMetadata(null, SelectedItemChanged));
private static void SelectedItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!(obj is TreeView))
return;
if (!Behaviors.ContainsKey(obj))
Behaviors.Add(obj, new TreeViewSelectedItemBehavior(obj as TreeView));
var view = Behaviors[obj];
view.ChangeSelectedItem(e.NewValue);
}
private class TreeViewSelectedItemBehavior
{
readonly TreeView _view;
public TreeViewSelectedItemBehavior(TreeView view)
{
_view = view;
view.SelectedItemChanged += (sender, e) => SetSelectedItem(view, e.NewValue);
}
internal void ChangeSelectedItem(object p)
{
var item = (TreeViewItem)_view.ItemContainerGenerator.ContainerFromItem(p);
if(item != null) item.IsSelected = true;
}
}
}
我的 Treeview 是这样工作的:
<TreeView
SelectedValuePath="Id"
DataContext="{Binding Path=TreeViewModel}"
ItemsSource="{Binding Items}"
Background="{StaticResource SliderThumbBackgroundBrush}"
helpers:TreeViewHelper.SelectedItem="{Binding Path=Items, Mode=TwoWay}">
这一切都很好,但我的挑战是,我如何设法让我的视图模型知道何时 DependencyProperty 发生变化?
提前致谢。
【问题讨论】:
-
这是正确的吗?
helpers:TreeViewHelper.SelectedItem="{Binding Path=Items, Mode=TwoWay}">您正在尝试将SelectedItem属性绑定到集合?
标签: c# wpf mvvm treeview dependency-properties