2017-01-09 5 views
0

Ну, у меня есть класс данных с некоторыми объектами данных, как это:содержимое не отображается в DataGrid

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"); 
     } 
    } 

И в MainWindow я добавил DataGrid, как это:

<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 ist установлено в класс данных. В конструкторе я назвал «DataContext = theData»; Я добавил некоторые значения в конструктор класса данных и проверял, запустив программу экземпляр этого класса. Значения правильно добавлены в ObservableCollection.

Но значения не показаны в таблице данных. Зачем?

ответ

1

Свойство ItemsSource из DataGrid должен быть установлен или связан с IEnumerable<T>. И один столбец в DataGrid должен быть привязан к свойству типа T. Вы пытаетесь связать DataGridTextColumn с ObservableCollection<string> и DataGridCheckBoxColumn с ObservableCollection<bool>, и это не имеет смысла. Они должны быть привязаны к объекту string и bool соответственно. Пожалуйста, обратитесь к следующему образцу кода.

Модель:

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

ну, я написал новый CaysDataObject, который реализовал модель Veiw в моем существующем классе данных помимо некоторых других данных. это немного отличается, но я узнал больше о том, как это работает, и я счастлив! – tux007

0

установка Try,

this.DataContext = theData; 
+0

Спасибо, но это тоже не работает. – tux007

0

Вы должны установить правильное свойство ItemsSource.

ItemsSource="{Binding User}" 

Вышеуказанная проблема будет устранена. Кроме того, вы должны уведомлять публичные объекты в Setter.

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

ну, я думаю, я должен уведомлять частные свойства в сеттер. Мой пример отлично работал для текстовых полей, и теперь мне нужно второе измерение. – tux007