简体   繁体   English

如何从附加的依赖属性为属性设置值?

[英]How to set value to property from attached dependency property?

I'm trying to show selected items of treeview in textblock.我正在尝试在文本块中显示树视图的选定项目。 This is my XAML code这是我的 XAML 代码

<Style TargetType="{x:Type TreeViewItem}">
   <Style.Triggers>
     <Trigger Property="IsSelected" Value="true">
       <Setter Property="vm:HLViewModel.SelectedNode" Value="{Binding ElementName="tree",Path=SelectedItem}"/>
     </Trigger>
   </Style.Triggers>
</Style>

Here is my textblock where I'm trying to show selected Item这是我的文本块,我试图在其中显示所选项目

<TextBlock Text="{Binding myText}"/>

I have created attached dependencyproperty which will be set when Treeview's IsSelected property is triggered.我创建了附加的dependencyproperty,它将在触发Treeview 的IsSelected 属性时设置。 How Can I set the value of myText in the callback function?如何在回调函数中设置 myText 的值?

public class HLViewModel : DependencyObject
    {
        public myText{get;set;}

        public static object GetSelectedNode(DependencyObject obj)
        {
            return (object)obj.GetValue(SelectedNodeProperty);
        }

        public static void SetSelectedNode(DependencyObject obj, object value)
        {
            obj.SetValue(SelectedNodeProperty, value);
        }

        public static readonly DependencyProperty SelectedNodeProperty =
            DependencyProperty.RegisterAttached("SelectedNode", typeof(object), typeof(HLViewModel), new PropertyMetadata("def",SelectedNode_changed));

        private static void SelectedNode_changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            // wanna set of myText property value here
        }

Here's the simple way to have a viewmodel use the selected item from a TreeView:这是让视图模型使用 TreeView 中选定项的简单方法:

XAML: XAML:

    <TreeView
        x:Name="MyTreeView"
        SelectedItemChanged="MyTreeView_SelectedItemChanged"

Codebehind:代码隐藏:

private void MyTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    (DataContext as MyViewModel).SelectedRoomLevelItem = e.NewValue;
}

Here's a much more sophisticated way of doing the same thing.这是做同样事情的更复杂的方法。 This example demonstrates how attached properties are used in WPF.此示例演示如何在 WPF 中使用附加属性。 Note that setting TreeViewAttached.SelectedItem will not set the selected item of the tree view -- if you want to do that, it's doable, but troublesome.请注意,设置TreeViewAttached.SelectedItem不会设置树视图的选定项——如果你想这样做,这是可行的,但很麻烦。 All this attached property does is allow you to write bindings which receive the selected item from the treeview when the selection changes.所有这些附加属性确实允许您在选择更改时写入从TreeView中接收所选项目的绑定。

public static class TreeViewAttached
{
    #region TreeViewAttached.SelectedItem Attached Property
    public static Object GetSelectedItem(TreeView obj)
    {
        return (Object)obj.GetValue(SelectedItemProperty);
    }

    public static void SetSelectedItem(TreeView obj, Object value)
    {
        obj.SetValue(SelectedItemProperty, value);
    }

    public static readonly DependencyProperty SelectedItemProperty =
        DependencyProperty.RegisterAttached("SelectedItem", typeof(Object), typeof(TreeViewAttached),
            new FrameworkPropertyMetadata(null) {
                BindsTwoWayByDefault = true
            });
    #endregion TreeViewAttached.SelectedItem Attached Property

    #region TreeViewAttached.MonitorSelectedItem Attached Property
    public static bool GetMonitorSelectedItem(TreeView obj)
    {
        return (bool)obj.GetValue(MonitorSelectedItemProperty);
    }

    public static void SetMonitorSelectedItem(TreeView obj, bool value)
    {
        obj.SetValue(MonitorSelectedItemProperty, value);
    }

    public static readonly DependencyProperty MonitorSelectedItemProperty =
        DependencyProperty.RegisterAttached("MonitorSelectedItem", typeof(bool), typeof(TreeViewAttached),
            new PropertyMetadata(false, MonitorSelectedItem_PropertyChanged));

    private static void MonitorSelectedItem_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if ((bool)e.NewValue)
        {
            (d as TreeView).SelectedItemChanged += TreeViewAttached_SelectedItemChanged;
        }
        else
        {
            (d as TreeView).SelectedItemChanged -= TreeViewAttached_SelectedItemChanged;
        }
    }

    private static void TreeViewAttached_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        SetSelectedItem(sender as TreeView, e.NewValue);
    }
    #endregion TreeViewAttached.MonitorSelectedItem Attached Property
}

XAML: XAML:

<TreeView
    local:TreeViewAttached.MonitorSelectedItem="True"
    local:TreeViewAttached.SelectedItem="{Binding SelectedRoomLevelItem}"
    ItemsSource="{Binding Items}"
    >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Items}">
            <Label Content="{Binding HeaderText}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
<Label Content="{Binding Path=SelectedRoomLevelItem.HeaderText}" />

My example uses a quickie treeview item datacontext class with Items and HeaderText properties.我的示例使用带有ItemsHeaderText属性的快速树视图项数据上下文类。 Your use of this code will have to adapt to the particular viewmodel classes in your project.您对这些代码的使用必须适应您项目中的特定视图模型类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM