2017-01-09 5 views
0

まあに表示されていない、私はこのようないくつかのデータオブジェクトとデータのクラスがあります。内容がデータグリッド

private ObservableCollection<bool> check = new ObservableCollection<bool>(); 
    public ObservableCollection<bool> Check 
    { 
     get { return check; } 
     set 
     { 
      check = value; 
      Notify("check"); 
     } 
    } 

    private ObservableCollection<string> user = new ObservableCollection<string>(); 
    public ObservableCollection<string> User 
    { 
     get { return user; } 
     set 
     { 
      user = value; 
      Notify("user"); 
     } 
    } 

をそしてメインウィンドウで私はこのようなデータグリッドを追加しました:について

<DataGrid AutoGenerateColumns="False" 
     Name="dataGrid1" 
     CanUserAddRows="False" CanUserSortColumns="False" CanUserResizeColumns="True" CanUserReorderColumns="False" 
     ItemsSource="{Binding}"> 
     <DataGrid.Columns > 
      <DataGridCheckBoxColumn Header = "" Binding="{Binding Check, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" MinWidth="50" /> 
      <DataGridTextColumn Header = "User" Binding="{Binding User, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" MinWidth="50" /> 
     </DataGrid.Columns> 
    </DataGrid> 

をウィンドウ全体で、datakontextはデータクラスに設定されていません。コンストラクタで私は "DataContext = theData"と呼ばれました。私は、データクラスのコンストラクタにいくつかの値を追加し、このクラスのインスタンスをプログラムで実行することによって証明しました。値はObservableCollectionに正しく追加されます。

ただし、値はデータグリッドには表示されません。どうして?

答えて

1

のDataGridのItemsSourceプロパティはIEnumerable<T>に設定するか、またはバインドする必要があります。また、DataGrid内の単一の列は、タイプTのプロパティにバインドする必要があります。 DataGridTextColumnをObservableCollection<string>に、DataGridCheckBoxColumnをObservableCollection<bool>にバインドしようとしていますが、これは意味がありません。それぞれstringboolプロパティにバインドする必要があります。次のサンプルコードを参照してください。

モデル:

public class YourDataObject : INotifyPropertyChanged 
{ 
    private bool _check; 
    public bool Check 
    { 
     get { return _check; } 
     set { _check = value; NotifyPropertyChanged(); } 
    } 

    private string _user; 
    public string User 
    { 
     get { return _user; } 
     set { _user = value; NotifyPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

ビューモデル:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     TheDataObjects = new ObservableCollection<YourDataObject>(); 
     TheDataObjects.Add(new YourDataObject()); 
     TheDataObjects.Add(new YourDataObject()); 
     TheDataObjects.Add(new YourDataObject()); 
    } 
    public ObservableCollection<YourDataObject> TheDataObjects { get; private set; } 
} 

ビュー:

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new ViewModel(); 
} 

<DataGrid AutoGenerateColumns="False" 
    Name="dataGrid1" 
    CanUserAddRows="False" CanUserSortColumns="False" CanUserResizeColumns="True" CanUserReorderColumns="False" 
    ItemsSource="{Binding TheDataObjects}"> 
    <DataGrid.Columns > 
     <DataGridCheckBoxColumn Header = "" Binding="{Binding Check, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" MinWidth="50" /> 
     <DataGridTextColumn Header = "User" Binding="{Binding User, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" MinWidth="50" /> 
    </DataGrid.Columns> 
</DataGrid> 
+0

まあ、私は新しいYourDataObjectを書いて、既存のデータクラスに実装されているVeiwモデルをいくつかの他のデータに追加しました。それは少し違っていますが、私はそれがどのように機能し、私は満足しているかについてもっと学びました! – tux007

0

は、あなたがのItemsSourceに適切なプロパティを設定する必要があり、設定

this.DataContext = theData; 
+0

ありがとうございますが、動作しません。 – tux007

0

を試してみてください。

ItemsSource="{Binding User}" 

上記の行が問題を解決します。 また、Setterのパブリックプロパティに通知する必要があります。

Notify("Check"); 
Notify("User"); 
+0

さて、私はセッターの私有地に通知しなければならないと思う。私の例は、テキストボックスでうまくいきました。そして今、私は第二次元が必要です。 – tux007

関連する問題