2017-10-05 3 views
-1

나는 텍스트 블록에서 treeview의 선택된 항목을 표시하려고합니다. 이 여기에 내가 선택한 항목을 표시하기 위해 노력하고있어 내 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> 

입니다

내가 트 리뷰의에 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의 selecteditem을 얻는 것입니다. TextBlock은 treeview에서 선택된 것을 보여주기 위해 필요합니다. 그것을 시험을 위해서만 반복합니다. 우리는 HLViewModel 클래스의 인스턴스를 알지 못하기 때문에 정적 함수 내에서 myText 값을 설정할 수 없습니다. d는 HLViewModel가 null을 제공하므로. d는 TreeViewItem에서 가져옵니다. –

답변

0

는 여기에 뷰 모델이 트 리뷰에서 선택한 항목을 사용하도록 간단한 방법 :

XAML :

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

Codebehind가 : 여기

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 속성을 가진 데이터 컨텍스트 클래스를 사용합니다. 이 코드를 사용하면 프로젝트의 특정 뷰 모델 클래스에 적응해야합니다.

관련 문제