【问题标题】:WPF Binding to DependencyProperty from ViewModelWPF 从 ViewModel 绑定到 DependencyProperty
【发布时间】: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}"&gt; 您正在尝试将 SelectedItem 属性绑定到集合?

标签: c# wpf mvvm treeview dependency-properties


【解决方案1】:

更改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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2011-05-31
    • 2013-01-20
    • 1970-01-01
    • 2011-12-14
    • 2011-02-01
    • 2010-12-05
    相关资源
    最近更新 更多