2016-08-27 14 views
0

일부 데이터가 DataGrid에 표시되고 CollectionView에 바인딩됩니다. 바인딩은 정상적으로 작동하지만 읽기 전용 인 것 같습니다. 그리드의 확인란을 선택해도 모델이 업데이트되지 않습니다.WPF ICollectionView 양방향 바인딩?

감소 광고 absurdum이 :

public class Item 
{ 
    public bool IsChecked 
    { 
     get 
     { 
      return _isChecked; 
     } 
     set 
     { 
      // Not hit when clicking on checkbox 
      _isChecked = value; 
     } 
    } 
    private bool _isChecked; 
} 

코드 뒤에, 내 컬렉션보기 종속성 속성입니다 :

 private static DependencyProperty __CollectionViewProperty = DependencyProperty.Register 
     (
      "_CollectionView", 
      typeof(ICollectionView), 
      typeof(MyClass), 
      new PropertyMetadata(null) 
     ); 

     private ICollectionView _CollectionView 
     { 
      get { return (ICollectionView)GetValue(__CollectionViewProperty); } 
      set { SetValue(__CollectionViewProperty, value); } 
     } 

그리고 다음과 같이 인스턴스화 다음 XAML에서

List<Item> items = new List<Item>(); 
items.Add(new Item()); 
this._CollectionView = CollectionViewSource.GetDefaultView(items); 

, _CollectionView에 DataGrid를 바인딩하고 IsChecked에 체크 상자를 간단히 바인딩합니다. 예외는 없으며 IsChecked의 상태가 UI에 올바르게 반영됩니다.

그러나 확인란을 클릭하면 모델이 아닌 UI 만 업데이트됩니다. Cocoa에서 나온 WPF가 처음입니다. NSArrayController와 같은 바인딩을 사용하면 바인딩이 양방향으로 곧바로 작동합니다. 내가 뭘 놓치고 있니?

편집 : XML 코드 :

<DataGrid Grid.Row="1" ItemsSource="{ Binding _CollectionView}" AutoGenerateColumns="False" GridLinesVisibility="None" 
        RowHeight="60" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
        CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="True" IsSynchronizedWithCurrentItem="True" 
        x:Name="_DataGrid"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="" Width="90" CanUserSort="False"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox IsChecked="{Binding IsChecked}" Click="CheckBox_Click" HorizontalAlignment="Left"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      <DataGrid.Columns> 
</DataGrid> 

답변

0

확인, 그것을 얻었다.

바보 같은 이유 때문에 컬렉션에 바인딩 할 때 기본 바인딩 모드는 OneWay이고 UpdateSourceTrigger는 PropertyChanged가 아닙니다. 그래서

, XAML 바인딩이된다 ... docs 바인딩되는 한 가지 방법을 언급하지만 업데이트 트리거는 다른 너무 것 :

<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

도 제대로 대상 UI에 전파 소스의 변경을하려면

public class Item : DependencyObject 
{ 
     private static DependencyProperty __IsCheckedProperty = DependencyProperty.Register 
     (
      "IsChecked", 
      typeof(bool), 
      typeof(iOSAppItem), 
      new PropertyMetadata(true) 
     ); 

     public bool IsChecked 
     { 
      get { return (bool)GetValue(__IsCheckedProperty); } 
      set { SetValue(__IsCheckedProperty, value); } 
     } 
} 

워드 프로세서에 따르면, DependencyProperty에도 the most efficient이다 사용 : 구성 요소, 가장 쉬운 방법은 DependencyObject에서 상속 및 종속성 속성으로 관련 속성을 선언하는 것입니다.

마지막으로 List에서 ObservableCollection을 선택하는 것이 좋습니다. 항목 삽입/삭제가 무료로 동기화됩니다.

0

는이처럼의 IsChecked 속성을 클래스에서에서 INotifyPropertyChanged를 구현하고 정의하려고했다 :

public virtual bool IsChecked 
    { 
     get 
     { return _isChecked; } 
     set 
     { 
      if (_isChecked != value) 
      { 
       _isChecked = value; 
       OnPropertyChanged("IsChecked"); 
      } 
     } 
    } 
+0

예, 시도해 봤지만 확인란을 클릭하면 설정자가 호출되지 않습니다 ... – Gregzo

+0

xaml을 복사 할 수 있습니까? – MohamedHamza

+0

추가됨. 클릭 이벤트도 모니터링하고 있었고, 잘 처리되었습니다. – Gregzo