2010-12-10 8 views
0

"잘못된"방향으로 데이터를 바인딩 할 수 있습니까? 내 ViewModel에 바인딩 된 사용자 정의 컨트롤의 값을 원합니다. "OneWayToSource"모드로 바인딩을 시도했지만 제대로 작동하지 않습니다.WPF MVVM ViewModel에 대한 사용자 정의 컨트롤 바인딩 목록

시나리오 (단순)

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     //Make sure the template in Themes/Generic.xaml is used. 
     DefaultStyleKeyProperty.OverrideMetadata(typeof (MyCustomControl), new FrameworkPropertyMetadata(typeof (MyCustomControl))); 

     //Create/Register the dependency properties. 
     CheckedItemsProperty = DependencyProperty.Register("MyStringList", typeof (List<string>), typeof (MyCustomControl), new FrameworkPropertyMetadata(new List<string>())); 
    } 

    public List<string> MyStringList 
    { 
     get 
     { 
      return (List<string>)GetValue(MyCustomControl.MyStringListProperty); 
     } 
     set 
     { 
      var oldValue = (List<string>)GetValue(MyCustomControl.MyStringListProperty); 
      var newValue = value; 
      SetValue(MyCustomControl.MyStringListProperty, newValue); 
      OnPropertyChanged(new DependencyPropertyChangedEventArgs(MyCustomControl.MyStringListProperty, oldValue, newValue)); 
     } 
    } 
    public static readonly DependencyProperty MyStringListProperty; 
} 

컨트롤이 조작하는 코드를 포함

난 문자열 목록은 종속성 속성이 지정 컨트롤 (MyCustomControl)가 명부.

나는이 사용자 지정 컨트롤을 ViewModel이있는 UserControl에서 사용합니다.

public List<string> MyStringsInTheViewModel 
{ 
    get 
    { 
     return _myStringsInTheViewModel; 
    } 
    set 
    { 
     if (value != _myStringsInTheViewModel) 
     { 
      _myStringsInTheViewModel = value; 
      OnPropertyChanged("MyStringsInTheViewModel"); 
     } 
    } 
} 
private List<string> _myStringsInTheViewModel; 

가 지금은 목록이 변경 될 때 수 있도록 내 뷰 모델 (MyStringsInTheViewModel)의 목록에 내 사용자 지정 컨트롤 (MyStringList)의 목록을 바인딩 할 : 뷰 모델은 문자열 목록도하는 속성이 있습니다 또한 사용자 정의 컨트롤에서 ViewModel에서도 변경됩니다. 나는

<myns:MyCustomControl MyStringList="{Binding Path=MyStringsInTheViewModel, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"> 

가 어떻게 이러한 바인딩을 만들 수 있습니다 ...이 시도했지만이 동작하지 않습니다?

+0

왜 'OneWayToSource'를 사용하고 있습니까? 나는'Mode'와'UpdateSourceTrigger'를 제거하는 것이 바인딩이 작동하기에 충분할 것이라고 생각합니다. –

답변

2

List<T> 대신 ObservableCollection<T>을 사용하십시오. 그것은 INotifyCollectionChanged 인터페이스를 구현합니다.

+0

아, 그게 문제였습니다. 실제 코드 인 ViewModel에서는 바인딩 목록 을 사용했지만 사용자 지정 컨트롤에는 목록이 있습니다. 사용자 지정 컨트롤에서도 BindingList 을 사용하도록 변경하면 문제가 해결되었습니다. 일리야 감사합니다! :) – haagel

관련 문제