2017-10-05 195 views
-1

我試圖在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。 –

回答

0

下面是簡單的辦法有一個視圖模型從一個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類。