2017-10-05 8 views
-1

私は、テキストブロックでtreeviewの選択項目を表示しようとしています。これは私の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> 

ここでは私がツリービューのIsSelectedプロパティがトリガされたときにセットされます添付したDependencyPropertyを作成した選択した項目に

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

を表示しようとしている私のテキストブロックです。どのようにコールバック関数で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の選択項目を取得することです。ツリービューで選択されているものを表示するには、TextBlockが必要です。それはテストのためだけです。私たちはHLViewModelクラスのインスタンスを知らないので、静的関数内にmyText値を設定することはできません。 HLViewModelはnullを返します。 dはTreeViewItemに由来します。 –

答えて

0

は、ここでのviewmodelは、ツリービューから選択した項目を使用できるようにするには、簡単な方法です:

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

私の例では、ItemsHeaderText性質を持つ急ごしらえのツリービュー項目のDataContextクラスを使用しています。このコードを使用すると、プロジェクトの特定のビューモデルクラスに適応する必要があります。

関連する問題