C# WPF MVVM ItemSource 没有附加列表
C# WPF MVVM ItemSource not attaching list
我有一个 Roles
的列表,我想在 DataGrid
单元格 ComboBox
中进行选择。
我有 ObservableCollection
Roles
用于在 ViewModel 中填充的 ComboBox
。
由于某种原因,ComboBox
中没有显示任何内容。附加此对象集合的正确方法是什么?
任何意见或建议都会有所帮助。
人物模型:
public int SelectedRole { get; set; }
角色模型:
public int Id { get; set; }
public int Role { get; set; }
public string Description { get; set; }
public string RoleInfo
{
get
{
return $"{Role} - {Description}";
}
}
ViewModel:
private ObservableCollection<PersonModel> _people;
public ObservableCollection<PersonModel> People
{
get { return _people; }
set
{
_people = value;
NotifyOfPropertyChange(() => People);
}
}
public ObservableCollection<RoleModel> _roles;
public ObservableCollection<RoleModel> Roles
{
get
{
return _roles;
}
set
{
_roles = value;
NotifyOfPropertyChange(() => Roles);
}
}
public PersonViewModel(IEventAggregator events, IWindowManager windowmanager)
{
_events = events;
_windowManager = windowmanager;
sql = "SELECT * FROM People";
People = SqliteConnector.LoadData<PersonModel>(sql, new Dictionary<string, object>());
sql = "SELECT * FROM Roles";
Roles = SqliteConnector.LoadData<PersonModel>(sql, new Dictionary<string, object>());
}
查看:
<DataGrid ItemsSource="{Binding Path=People}"
AutoGenerateColumns="False"
CanUserDeleteRows="True"
CanUserReorderColumns="True"
CanUserAddRows="True"
AlternatingRowBackground="#dfdfdf"
cm:Message.Attach="[Event RowEditEnding] = [Action SaveOrUpdate()]">
<DataGridTemplateColumn Header="Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Role}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="RoleInfo"
ItemsSource="{Binding Path=Roles}"
SelectedValue="{Binding Path=SelectedRole, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Role" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid>
DataGrid 的“行”元素的 DataContext 是 ItemsSource 集合的对应项,即 PersonModel 实例 - 当然没有 Roles
属性。您应该已经在 Visual Studio.
中的输出 Window 中观察到相应的数据绑定错误消息
为了绑定到父视图模型的角色 属性,使用如下表达式:
ItemsSource="{Binding DataContext.Roles,
RelativeSource={RelativeSource AncestorType=DataGrid}}"
SelectedValue 绑定可以简单地如下所示,因为 PropertyChanged
已经是 属性.
的默认值 UpdateSourceTrigger
SelectedValue="{Binding Path=SelectedRole}"
当您 运行 您的程序时,请检查输出 window 以准确了解该控件在加载时出现了何种错误。这将使您更好地了解抛出的异常类型。我的猜测是 ComboBox 的 ItemsSource 正在您的 Person 模型中寻找 ObservableCollection Roles,并且抛出异常,因为 Roles 仅在您的 ViewModel 中。尝试将此集合移动到 Person Model 并通过 Person Model 构造函数为其分配初始值。
我有一个 Roles
的列表,我想在 DataGrid
单元格 ComboBox
中进行选择。
我有 ObservableCollection
Roles
用于在 ViewModel 中填充的 ComboBox
。
由于某种原因,ComboBox
中没有显示任何内容。附加此对象集合的正确方法是什么?
任何意见或建议都会有所帮助。
人物模型:
public int SelectedRole { get; set; }
角色模型:
public int Id { get; set; }
public int Role { get; set; }
public string Description { get; set; }
public string RoleInfo
{
get
{
return $"{Role} - {Description}";
}
}
ViewModel:
private ObservableCollection<PersonModel> _people;
public ObservableCollection<PersonModel> People
{
get { return _people; }
set
{
_people = value;
NotifyOfPropertyChange(() => People);
}
}
public ObservableCollection<RoleModel> _roles;
public ObservableCollection<RoleModel> Roles
{
get
{
return _roles;
}
set
{
_roles = value;
NotifyOfPropertyChange(() => Roles);
}
}
public PersonViewModel(IEventAggregator events, IWindowManager windowmanager)
{
_events = events;
_windowManager = windowmanager;
sql = "SELECT * FROM People";
People = SqliteConnector.LoadData<PersonModel>(sql, new Dictionary<string, object>());
sql = "SELECT * FROM Roles";
Roles = SqliteConnector.LoadData<PersonModel>(sql, new Dictionary<string, object>());
}
查看:
<DataGrid ItemsSource="{Binding Path=People}"
AutoGenerateColumns="False"
CanUserDeleteRows="True"
CanUserReorderColumns="True"
CanUserAddRows="True"
AlternatingRowBackground="#dfdfdf"
cm:Message.Attach="[Event RowEditEnding] = [Action SaveOrUpdate()]">
<DataGridTemplateColumn Header="Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Role}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="RoleInfo"
ItemsSource="{Binding Path=Roles}"
SelectedValue="{Binding Path=SelectedRole, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Role" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid>
DataGrid 的“行”元素的 DataContext 是 ItemsSource 集合的对应项,即 PersonModel 实例 - 当然没有 Roles
属性。您应该已经在 Visual Studio.
为了绑定到父视图模型的角色 属性,使用如下表达式:
ItemsSource="{Binding DataContext.Roles,
RelativeSource={RelativeSource AncestorType=DataGrid}}"
SelectedValue 绑定可以简单地如下所示,因为 PropertyChanged
已经是 属性.
UpdateSourceTrigger
SelectedValue="{Binding Path=SelectedRole}"
当您 运行 您的程序时,请检查输出 window 以准确了解该控件在加载时出现了何种错误。这将使您更好地了解抛出的异常类型。我的猜测是 ComboBox 的 ItemsSource 正在您的 Person 模型中寻找 ObservableCollection Roles,并且抛出异常,因为 Roles 仅在您的 ViewModel 中。尝试将此集合移动到 Person Model 并通过 Person Model 构造函数为其分配初始值。