如何从附属依赖项属性设置属性值?

如何从附属依赖项属性设置属性值?

问题描述:

我试图在textblock中显示树视图的选定项目。这是我的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> 

这是我的文本块在那里我试图表现出所选项目

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

我创建的时候TreeView的IsSelected属性被触发,这将设置连接的DependencyProperty。如何在回调函数中设置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 
     } 
+0

'myText'是一个实例属性。你在任何地方都有一个HLViewModel的实例吗?它在哪里?我没有看到你创建一个地方的任何地方。什么是“想要的”? –

+0

您是否猜测在TreeViewItem上设置附加属性将创建附加属性定义的类的实例?事实并非如此。您正在将该属性添加到TreeViewItem。 –

+0

@EdPlunkett此代码仅供测试。我的目标是获得treeview的selecteditem。需要TextBlock来显示在treeview中选择的内容。重复它只是为了测试。我不能在静态函数中设置myText值,因为我们不知道HLViewModel类的实例。 d作为HLViewModel给出null。 d来自TreeViewItem。 –

下面是简单的办法有一个视图模型从一个TreeView使用所选的项目:

XAML:

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

代码隐藏:

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

这里是一个更复杂做同样事情的方法。此示例演示如何在WPF中使用附加属性。请注意,设置TreeViewAttached.SelectedItem将不会设置树形视图的选定项目 - 如果您想这样做,这是可行的,但麻烦。所有这些附加属性都允许您在选择更改时写入从树视图中选择的项目的接收的绑定。

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:

<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}" /> 

我的示例使用一个匆匆的TreeView项与ItemsHeaderText性能DataContext类。你对这段代码的使用必须适应你项目中特定的viewmodel类。