2017-11-03 2 views
-1

저는 WPF로 데이터를 바인딩하고 ObservableCollection에 대한 DataGrid에 대한 편집을받는 것에 대해 고민하고 있습니다. WPF - 바인딩이 2 가지 방식으로 작동하지 않는 이유는 무엇입니까?

가 나는 ObservableCollection에 그들이 가 그리드가 성공적으로 에 어떤 데이터로 채워

좌표라고 잡고, 사용자는 점 (X와 Y)에 대한 값을 기존 편집 할 수 있도록 설계된 데이터 그리드를 만든 좌표. 그러나 X 또는 Y 값을 데이터 격자에서 변경할 때마다 (어떤 이유로 인해 X와 Y에 대한 중복 열이 만들어진 것처럼 보임) 좌표는으로 업데이트되지 않습니다. 콘솔). 왜 이런 경우입니까?

  <DataGrid x:Name="XYDataGrid" 
        CanUserSortColumns="False" 
        CanUserReorderColumns="False" 
        CanUserResizeColumns="False" 
        CanUserResizeRows="False" 
        ColumnWidth="*" 
        ItemsSource="{Binding}" 
        LostFocus="XYDataGrid_LostFocus"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="X" Binding="{Binding X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
       <DataGridTextColumn Header="Y" Binding="{Binding Y, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
      </DataGrid.Columns> 
     </DataGrid> 

그리고 내 C#에서

가 :

private ObservableCollection<Point> coordinates = new ObservableCollection<Point>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     coordinates.Add(new Point() 
     { 
      X = 1, 
      Y = 1 
     }); 

     this.DataContext = coordinates;    
    } 

    private void XYDataGrid_LostFocus(object sender, RoutedEventArgs e) 
    { 
     Console.WriteLine((coordinates[0].X).ToString()); 

    } 
+1

'AutoGenerateColumns = "False"를 추가하여 DataGrid에 추가 열을 제거하십시오. 기본적으로 그리드는'DataContext'에서 찾은 속성을 기반으로 열을 생성합니다. –

+3

Point는 구조체이므로 [참조 유형]이 아닙니다 (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types). – Clemens

+0

그렇지 않은 경우 INotifyPropertyChanged 인터페이스를 구현해야합니다. –

답변

0

처럼 @Clemens 지적, 포인트는 구조체있는 값 형식이 아닌 것입니다 여기에

는 XAML 코드 참조 유형.

public class CustomPoint 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

그런 다음에 컬렉션을 변경 : 대신, 뭔가 같은 클래스를 사용

private ObservableCollection<CustomPoint> coordinates = new ObservableCollection<CustomPoint>(); 

그리고 중복 열을 제거하려면 AutoGenerateColumns = "false"로 설정하여 @Bradley Uffner 조언에 따라 :

<DataGrid x:Name="XYDataGrid" 
        CanUserSortColumns="False" 
        CanUserReorderColumns="False" 
        CanUserResizeColumns="False" 
        CanUserResizeRows="False" 
        ColumnWidth="*" 
        ItemsSource="{Binding}" 
        AutoGenerateColumns="False" 
        LostFocus="XYDataGrid_LostFocus"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="X" Binding="{Binding X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
       <DataGridTextColumn Header="Y" Binding="{Binding Y, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
관련 문제