[英]WPF Binding to DependencyProperty from ViewModel
我正在努力解決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更改時,如何設法讓我的視圖模型知道?
提前致謝。
更改UIPropertyMetadata
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(TreeViewHelper), new UIPropertyMetadata(null, SelectedItemChanged));
到FrameworkPropertyMetadata
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(TreeViewHelper), new FrameworkPropertyMetaData(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, SelectedItemChanged));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.