2016-10-15 11 views
3

itemsourceがプログラムによって変更された場合、WPF Datagridを正常に更新できません。DataGrid itemsourceバインディングが更新されず、WPFでバインディングが機能しない

XAML

<DataGrid Name="ReaderGrid" ItemsSource="{Binding myData}" Height="Auto" Width="Auto" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" IsReadOnly="True" GridLinesVisibility="None"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Count" Width="*" FontSize="14" Binding="{Binding count}" /> 
     <DataGridTextColumn Header="Total" Width="*" FontSize="14" Binding="{Binding total}" /> 
    </DataGrid.Columns> 
</DataGrid> 

XAML.CS(コードビハインド)

public partial class MainWindow : Window 
{ 
    public ObservableCollection<obj> myData { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     myData = new ObservableCollection<obj>(); 
     InitializeMyData(); 

最後の関数(InitializeMyDataは())だけ試験情報とMYDATAを満たします。

そして最後に、オブジェクトはいくつかのテストクラス

public class obj 
{ 
    public int count { get; set; } 
    public double total { get; set; } 
} 
コードはAS-ISが動作しない

で、WPFの私のデータグリッドが空であることを除き、エラーはありません - 唯一の方法は、私はこの問題を解決することが判明しました私は今、すべての私の最初のデータが示されている、ことを除いて、任意の時点で、この後、私はマイデータを変更した場合、私は変更が自動的に反映させることを期待/望んでいるだろうデータ

ReaderGrid.ItemsSource = myData; 

を初期化した後に、次のコードを追加することです私のWPF Datagridでは、悲しいことに、何も更新されていません...なぜ私のWPFバインディングが機能しないのですか(ItemSourceのコードビハインドに明示的に設定する必要があるのはなぜですか?)なぜmyDataの変更が自分のDatagridを更新しないのですか?

おかげで、

答えて

5

ItemsSource="{Binding myData}" 

のような結合は、明示的バインディングのソースオブジェクトを定義しますが、ソースプロパティONYはありません。バインディングターゲットのDataContextが設定されている必要があります。次に、このオブジェクトがソースオブジェクトとして使用されます。

DataContextは、親要素から子要素に継承され、以下に示すようにウィンドウのコンストラクタで設定されることがよくあります。

MainWindowクラスはsourceプロパティを所有しているため、MainWindowインスタンスですが、通常はバインディングソースプロパティを宣言するビューモデルクラスのインスタンスになります(INotifyPropertyChangedインターフェイスを実装してプロパティ値変更)。

​​

そのあなたの財産が良いMyData名前を付ける必要がありますので、広く受け入れられているのコーディング規則に従って、C#のプロパティ名は、大文字で始まるにも注意してください。あなたの第二の問題については


、更新されていないデータ、データ項目クラスは次のように、INotifyPropertyChangedインタフェースを実装する必要があります:WPFのすべての詳細について

public class obj : INotifyPropertyChanged 
{ 
    public event PropertyChanged; 

    private int _count; 
    public int Count 
    { 
     get { return _count; } 
     set 
     { 
      _count = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count")); 
     } 
    } 
} 

データバインディングについては、MSDNのData Binding Overviewの記事を参照してください。

関連する問題