在 WPF 中将 DataGrid 绑定到 ObservableCollection<T>
Bind a DataGrid to an ObservableCollection<T> in WPF
如何将具有两列(DataGridTextColumn
和 DataGridComboBoxColumn
)的 Datagrid
绑定到 ObservableCollection<Team> Teams
?
DataGridTextColumn
绑定正确。但是 DataGridComboBoxColumn
.
中什么也没有显示
代码隐藏
public class Team
{
public string Name { get; set; }
public List<string> Members { get; set; }
}
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Team> teams = new ObservableCollection<Team>
{
new Team()
{
Name = "A", Members = new List<string> {"John", "Jack"},
},
new Team()
{
Name = "B", Members = new List<string> {"Sarah", "Anna"},
}
};
public ObservableCollection<Team> Teams
{
get { return teams; }
set
{
teams = value;
RaisePropertyChanged("Teams");
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
XAML
<DataGrid ItemsSource="{Binding Path=Teams}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Team"
IsReadOnly="True"
Width="*"
Binding="{Binding Name}"/>
<DataGridComboBoxColumn Header="Members"
Width="*"
/>
</DataGrid.Columns>
</DataGrid>
您需要使用 ViewModel 实例设置 DataContext
属性 控件。比如,在控制构造函数中
this.DataContext = new ViewModel();
并在 XAML
中填写 DisplayMemberPath
<DataGridTextColumn Header="Team" DisplayMemberPath="Name" ...
更新
我错了。因为 DataGridComboboxColumn
不继承 DataContext,所以你必须按以下方式做你想做的事:
<DataGrid ItemsSource="{Binding Path=Teams}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Team"
IsReadOnly="True"
Width="*"
Binding="{Binding Name}" />
<DataGridComboBoxColumn Header="Members"
Width="*"
>
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Members}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Members}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
只需使用"DataGridTemplateColumn"。
不要忘记添加一个 selectedItem 成员。
<DataGridTemplateColumn Header="Members">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="wpfApplication1:Team">
<ComboBox ItemsSource="{Binding Members}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
如何将具有两列(DataGridTextColumn
和 DataGridComboBoxColumn
)的 Datagrid
绑定到 ObservableCollection<Team> Teams
?
DataGridTextColumn
绑定正确。但是 DataGridComboBoxColumn
.
代码隐藏
public class Team
{
public string Name { get; set; }
public List<string> Members { get; set; }
}
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Team> teams = new ObservableCollection<Team>
{
new Team()
{
Name = "A", Members = new List<string> {"John", "Jack"},
},
new Team()
{
Name = "B", Members = new List<string> {"Sarah", "Anna"},
}
};
public ObservableCollection<Team> Teams
{
get { return teams; }
set
{
teams = value;
RaisePropertyChanged("Teams");
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
XAML
<DataGrid ItemsSource="{Binding Path=Teams}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Team"
IsReadOnly="True"
Width="*"
Binding="{Binding Name}"/>
<DataGridComboBoxColumn Header="Members"
Width="*"
/>
</DataGrid.Columns>
</DataGrid>
您需要使用 ViewModel 实例设置 DataContext
属性 控件。比如,在控制构造函数中
this.DataContext = new ViewModel();
并在 XAML
中填写 DisplayMemberPath<DataGridTextColumn Header="Team" DisplayMemberPath="Name" ...
更新
我错了。因为 DataGridComboboxColumn
不继承 DataContext,所以你必须按以下方式做你想做的事:
<DataGrid ItemsSource="{Binding Path=Teams}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Team"
IsReadOnly="True"
Width="*"
Binding="{Binding Name}" />
<DataGridComboBoxColumn Header="Members"
Width="*"
>
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Members}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Members}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
只需使用"DataGridTemplateColumn"。 不要忘记添加一个 selectedItem 成员。
<DataGridTemplateColumn Header="Members">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="wpfApplication1:Team">
<ComboBox ItemsSource="{Binding Members}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>