2013-11-05 5 views
0

DataGrid와 ListView 간의 양방향 바인딩 처리시 불일치를 이해하는 데 문제가 있습니다. 하위 목록에 addeDataGrid와 ListView 간의 양방향 바인딩

public class DataItem 
{ 
    public bool Flag { get; set; } 
    public int IntValue { get; set; } 
    public string StringValue { get; set; } 

    public List<DataItem> SubList { get; set; } 

    public DataItem()[...] 

} 

내가 추가있는 DataItem 개체의 번호와 주요있는 DataItem 개체를 만들 : 설명하기 위해, 나는 몇 가지 속성을 가진 클래스있는 DataItem 및 데이터 그리드/ListView에 바인딩에 대한 DataItems의 목록을 . 주요있는 DataItem이 포함 된 그리드의 DataContext를 설정하고, 하위 목록은 모두의 ListView에 바인딩 :

  <ListView ItemsSource="{Binding Path=SubList}"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="Flag" Width="Auto"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <CheckBox Name="FlagCheckBox" IsChecked="{Binding Path=Flag}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn Header="String Value" Width="100"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBox Name="StringTextBox" Text="{Binding Path=StringValue}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
        </GridView> 
       </ListView.View> 
      </ListView> 

및 데이터 그리드에 :

  <DataGrid ItemsSource="{Binding Path=SubList}" AutoGenerateColumns="False"> 
       <DataGrid.Columns> 
        <DataGridTemplateColumn Header="Flag" Width="SizeToCells"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Name="FlagCheckBox" IsChecked="{Binding Path=Flag}" /> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
        <DataGridTemplateColumn Header="String Value" Width="SizeToCells"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBox Name="StringTextBox" Text="{Binding Path=StringValue}" /> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
       </DataGrid.Columns> 
      </DataGrid> 

ListView에 모두 제대로 표시하려면 데이터 그리드 SubList 항목 그러나 UI의 데이터를 수정하고 소스 DataItem.SubList를 검사하면 ListView가 작동하고 DataGrid가 다음 작업을 수행하지 않습니다. ListView에서 변경 사항을 볼 수 있지만 DataGrid에는 변경 사항이 없습니다.

바인딩이 정확해야합니다. 그렇지 않으면 값이 제대로 표시되지 않습니다. 그러나 몇 가지 이유로 ListView에서 양방향 바인딩이 작동하여 UI에서 변경 한 내용을 원본 개체로 되돌리고 DataGrid에서는 다시 이동할 수 없습니다.

답변

0

DataGrid의 경우 변경 사항을 DataObject 클래스에 전파하려면 UpdateSourceTrigger에서 PropertyChanged으로 설정해야합니다.

<CheckBox Name="FlagCheckBox" IsChecked="{Binding Path=Flag, 
              UpdateSourceTrigger=PropertyChanged}"/> 

그리고 너무 텍스트 상자에

- 작동처럼

<TextBox Name="StringTextBox" Text="{Binding Path=StringValue, 
             UpdateSourceTrigger=PropertyChanged}"/> 
+0

덕분에,이 보인다. UpdateSourceTrigger의 기본 설정은 소스를 업데이트하지 않는 것입니다. – garzooma