2017-11-03 5 views
-1

私は、WPFでデータバインディングを行い、ObservableCollectionのデータグリッドに対して編集を受け取るのに苦労しました。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#で:ここで

は、XAMLコードである

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

ポイントは構造体なので、[参照型](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types)ではありません。 – Clemens

+0

INotifyPropertyChangedインターフェイスを実装する必要があります。 –

答えて

0

@Clemensは指摘のように、ポイントが 値型である構造体とではありません参照型。

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> 
関連する問題