从附加属性内部设置属性的值

时间:2016-07-05 18:02:18

标签: c# wpf attached-properties

我有一个名为TreeViewSelectedItem的附加属性。我没有详细说明为什么我需要这个附加属性,我会说它必须根据TreeView中选择的项目类型更新我的VM上的不同属性。

我的问题是,我似乎无法获取我的代码来更新VM上的属性。

xaml设置:

    <TreeView ItemsSource="{Binding Lists}" l:BindableSelectedItemBehavior.TreeViewSelectedItem="{Binding SelectedListGroup}">

        <ItemsControl.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding }" >
                <TextBlock Text="{Binding Key}"/>
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Key}"/>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>                    
            </HierarchicalDataTemplate>
        </ItemsControl.ItemTemplate>
    </TreeView>

我的附属财产:

    public static object GetTreeViewSelectedItem(DependencyObject obj)
    {
        return (object)obj.GetValue(TreeViewSelectedItemProperty);
    }

    public static void SetTreeViewSelectedItem(DependencyObject obj, object value)
    {
        obj.SetValue(TreeViewSelectedItemProperty, value);
    }

    // Using a DependencyProperty as the backing store for TreeViewSelectedItem.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TreeViewSelectedItemProperty =
        DependencyProperty.RegisterAttached("TreeViewSelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null,
            (s,a) =>
            {
                TreeView tree = s as TreeView;

                if (tree == null)
                    return;

                if (a.NewValue != null)
                {
                    tree.SelectedItemChanged += tree_SelectedItemChanged;
                    tree.SourceUpdated += tree_SourceUpdated;
                }
                else
                {

                }

            }));

    static void tree_SourceUpdated(object sender, System.Windows.Data.DataTransferEventArgs e)
    {
        throw new NotImplementedException();
    }

    static void tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        TreeView tree = sender as TreeView;
        object binding;
        BindingExpression bindingExp;

        if (tree == null)
            return;

        bindingExp = BindingOperations.GetBindingExpression(tree, BindableSelectedItemBehavior.TreeViewSelectedItemProperty);
        binding = GetTreeViewSelectedItem(tree);

        if (binding == null)
            return;

        if (binding.GetType() == e.NewValue.GetType())
        {
            System.Diagnostics.Debug.WriteLine("Type match");
            binding = tree.SelectedItem;
            //tree.SetValue(BindableSelectedItemBehavior.TreeViewSelectedItemProperty, tree.SelectedItem);
            //SetTreeViewSelectedItem(tree, tree.SelectedItem);
            tree.SetCurrentValue(BindableSelectedItemBehavior.TreeViewSelectedItemProperty, tree.SelectedItem);
        }

    }

在底部,我已经尝试了许多不同的方法来尝试更新这个附加属性绑定但是它似乎没有点击VM属性的Set方法(没有点击断点)。

如何更新该属性?

1 个答案:

答案 0 :(得分:0)

事实证明,解决方案是1:使用SetTreeViewSelectedItem(tree, tree.SelectedItem);(我已经注释掉了) 和2:在绑定中使用Mode = TwoWay。

我将注意到,解决我在此尝试完成的另一种方法是使用TreeView的IsSelected属性并将其绑定到底层VM上的某个布尔属性。一些人(如Julien和Maverik)指出了这一点。虽然我无法在非常特殊的情况下使用它,但这是99.9%的情况。

相关问题