2014-04-15 2 views
0

WPF DependencyProperty/ViewModel 바인딩 문제로 고민하고 있습니다.WPF에서 ViewModel의 DependencyProperty에 바인딩

나는 트 리뷰에 대한 헬퍼 클래스와이 클래스가 있습니다

public class TreeViewHelper : DependencyObject 
{ 
    private static readonly Dictionary<DependencyObject, TreeViewSelectedItemBehavior> Behaviors = new Dictionary<DependencyObject, TreeViewSelectedItemBehavior>(); 

    public static object GetSelectedItem(DependencyObject obj) 
    { 
     return obj.GetValue(SelectedItemProperty); 
    } 

    public static void SetSelectedItem(DependencyObject obj, object value) 
    { 
     obj.SetValue(SelectedItemProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for SelectedItem. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty SelectedItemProperty = 
     DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(TreeViewHelper), new UIPropertyMetadata(null, SelectedItemChanged)); 

    private static void SelectedItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     if (!(obj is TreeView)) 
      return; 

     if (!Behaviors.ContainsKey(obj)) 
      Behaviors.Add(obj, new TreeViewSelectedItemBehavior(obj as TreeView)); 

     var view = Behaviors[obj]; 
     view.ChangeSelectedItem(e.NewValue); 


    } 

    private class TreeViewSelectedItemBehavior 
    { 
     readonly TreeView _view; 
     public TreeViewSelectedItemBehavior(TreeView view) 
     { 
      _view = view; 
      view.SelectedItemChanged += (sender, e) => SetSelectedItem(view, e.NewValue); 
     } 

     internal void ChangeSelectedItem(object p) 
     { 
      var item = (TreeViewItem)_view.ItemContainerGenerator.ContainerFromItem(p); 
      if(item != null) item.IsSelected = true; 
     } 
    } 
} 

을 그리고 내 트 리뷰는이 방식으로 작동합니다

<TreeView 
         SelectedValuePath="Id" 
         DataContext="{Binding Path=TreeViewModel}" 
         ItemsSource="{Binding Items}" 
         Background="{StaticResource SliderThumbBackgroundBrush}" 
         helpers:TreeViewHelper.SelectedItem="{Binding Path=Items, Mode=TwoWay}"> 

을 그리고 그것은 모두 잘 작동하지만 나의 도전은 어떻게입니다 DependencyProperty가 변경되면 내 viewmodel에 알릴 수 있습니까?

미리 감사드립니다.

+0

이 맞습니까? 'Helpers : TreeViewHelper.SelectedItem = "{Binding Path = Items, Mode = TwoWay}">'SelectedItem' 속성을 컬렉션에 바인딩하려고합니까? –

답변

1

변경 UIPropertyMetadata

public static readonly DependencyProperty SelectedItemProperty = 
     DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(TreeViewHelper), new UIPropertyMetadata(null, SelectedItemChanged)); 

FrameworkPropertyMetadata

public static readonly DependencyProperty SelectedItemProperty = 
     DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(TreeViewHelper), new FrameworkPropertyMetaData(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, SelectedItemChanged)); 
관련 문제