c# - MVVM DataGrid ComboBox SelectedValue 绑定
问题描述
我有 2 个数据网格,我希望在第一个数据网格上有一个包含第二个数据网格的组合框,当我从组合框中选择一个值时,将值放入第一个数据网格中。
在我的情况下,当我从组合框中选择材料时,我希望自动放置 CoefD 列。这是我的代码。
当我保存文件并且我想打开选择的材料时,我想留在那里。
型号:TName(第一个数据网格)
public class TMaterial : Changed
{
public string name;
public string color;
private string materialn;
private string coefDn;
private string nameDraw;
private string drawPath;
public string Name
{
get { return name; }
set
{
if (name != value)
{
name = value;
RaisePropertyChanged("Name");
}
}
}
public string Color
{
get { return color; }
set
{
if(color != value)
{
color = value;
RaisePropertyChanged("Color");
}
}
}
public string Materialn
{
get { return materialn; }
set
{
if (materialn != value)
{
materialn = value;
RaisePropertyChanged("Materialn");
}
}
}
public string CoefDn
{
get { return coefDn; }
set
{
if (coefDn != value)
{
coefDn = value;
RaisePropertyChanged("CoefDn");
}
}
}
public string NameDraw
{
get { return nameDraw; }
set
{
if (nameDraw != value)
{
nameDraw = value;
RaisePropertyChanged("NameDraw");
}
}
}
public string DrawPath
{
get { return drawPath; }
set
{
if (drawPath != value)
{
drawPath = value;
RaisePropertyChanged("DrawPath");
}
}
}
public override string ToString()
{
return name;
}
}
型号:TMaterial(第二个数据网格)
public class TMaterial : Changed
{
private string material;
private string coefD;
public string Material
{
get { return material; }
set
{
if(material != value)
{
material = value;
RaisePropertyChanged("Material");
}
}
}
public string CoefD
{
get { return coefD; }
set
{
if(coefD != value)
{
coefD = value;
RaisePropertyChanged("CoefD");
}
}
}
}
视图模型:
public class AddNameViewModel : Changed
{
private TName tnm;
private ObservableCollection<TName> _dimensionName;
private ObservableCollection<TMaterial> _materials;
public AddNameViewModel()
{
DimensionName = new ObservableCollection<TName>
{
new TName{ Name="All"},
};
Materials = new ObservableCollection<TMaterial>
{
new TMaterial{Material="Aluminium" , CoefD="23.1"},
new TMaterial{ Material="Brass",CoefD="19"},
new TMaterial{ Material="Carbon Steel",CoefD="10.8"},
new TMaterial{ Material="Concrete",CoefD="12"},
new TMaterial{ Material="Platinum",CoefD="9"},
new TMaterial{ Material="Iron",CoefD="11.8"},
};
}
public ObservableCollection<TMaterial> Materials
{
get { return _materials; }
set
{
if (_materials != value)
{
_materials = value;
RaisePropertyChanged("Materials");
}
}
}
public ObservableCollection<TName> DimensionName
{
get { return _dimensionName; }
set
{
if (_dimensionName != value)
{
_dimensionName = value;
RaisePropertyChanged("DimensionName");
}
}
}
private TName sdimensionName;
private TMaterial smaterials;
public TName SDimensionName
{
get { return sdimensionName; }
set
{
if (sdimensionName != value)
{
sdimensionName = value;
RaisePropertyChanged("SDimensionName");
}
}
}
public TMaterial SMaterials
{
get { return smaterials; }
set
{
if (smaterials != value)
{
smaterials = value;
RaisePropertyChanged("SMaterials");
}
}
}
}
查看 XAML 危险品:
<Grid Name="GridC" Margin="0,0,0,-203" >
<DataGrid CanUserAddRows="True" CurrentCellChanged="NameDataGrid_CurrentCellChanged" AutoGenerateColumns="False" ItemsSource="{Binding DimensionName,NotifyOnSourceUpdated=True}" RowEditEnding="NameDataGrid_RowEditEnding" Name="NameDataGrid" HorizontalAlignment="Left" VerticalAlignment="Top" Loaded="NameGrid_Load" Margin="0,25,0,0" Height="auto" Width="auto" >
<DataGrid.Columns >
<DataGridTextColumn Header="Name" Binding="{Binding Name , Mode=TwoWay}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background" Value="{Binding Color}"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn Header="Color">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<xctk:ColorPicker SelectedColorChanged="ColorPicker_SelectedColorChanged" Background="{Binding Color}" SelectedColor="{Binding Color,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Material">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectionChanged="ComboBox_SelectionChanged"
Width="150"
IsEditable="True"
IsDropDownOpen="False"
ItemsSource="{Binding
Path = DataContext.Materials,
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
DisplayMemberPath="Material"
SelectedItem="{Binding SMaterials}"
IsReadOnly="True"
>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn IsReadOnly="False" Header="Coef" Binding="{Binding SMaterials.CoefD,NotifyOnSourceUpdated =True}"/>
<DataGridTextColumn IsReadOnly="True" Header="Drawing Number" Binding="{Binding NameDraw , Mode=TwoWay}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="ToolTip">
<Setter.Value>
<Image RenderOptions.BitmapScalingMode="Fant" Width="350" Height="350" Source="{Binding DrawPath}"/>
</Setter.Value>
</Setter>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Add Drawing" Click="AddDrawing_Click_1"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="delet" Click="Delete_Click_1">
<StackPanel>
<Image Source="/Image/delete2.jpg" Width="20" Height="20"/>
</StackPanel>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
解决方案
首先,请理解这是我制作的示例代码,而不是您使用的代码。
整个源代码在Github中。
模型 - 员工(第一个数据网格)
public class Employees
{
public string Name { get; set; }
public int Age { get; set; }
public Department Department { get; set; }
}
模型 - 部门(第二个数据网格)
public class Department
{
public string DepartmentCode { get; set; }
public string DepartmentName { get; set; }
}
将要绑定的模型(部门)作为
Employee
类中的变量。
视图模型
public class MainViewModel : ObservableObject
{
private ObservableCollection<Employees> _employees;
public ObservableCollection<Employees> Employees
{
get { return _employees; }
set { _employees = value; OnPropertyChanged(); }
}
private ObservableCollection<Department> _departments;
public ObservableCollection<Department> Departments
{
get { return _departments; }
set { _departments = value; OnPropertyChanged(); }
}
private string _departmentName;
public string DepartmentName
{
get { return _departmentName; }
set { _departmentName = value; OnPropertyChanged(); }
}
public MainViewModel()
{
Employees = GetEmployees();
Departments = GetDepartments();
}
private ObservableCollection<Employees> GetEmployees()
{
ObservableCollection<Employees> employees = new ObservableCollection<Employees>
{
new Employees { Name = "James", Age = 30 },
new Employees { Name = "Elena", Age = 26 },
new Employees { Name = "Rookie", Age = 38 }
};
return employees;
}
private ObservableCollection<Department> GetDepartments()
{
ObservableCollection<Department> departments = new ObservableCollection<Department>
{
new Department { DepartmentCode = "0001", DepartmentName = "Develop" },
new Department { DepartmentCode = "0002", DepartmentName = "Marketing" },
new Department { DepartmentCode = "0003", DepartmentName = "HR" }
};
return departments;
}
}
主视图.xaml
<Grid VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<DataGrid AutoGenerateColumns="False" SelectionMode="Single" CanUserAddRows="False"
ItemsSource="{Binding Employees}" Grid.Column="0" AlternatingRowBackground="#F1F1F1" Height="100">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True" Width="70"/>
<DataGridTextColumn Header="Age" Binding="{Binding Age}" IsReadOnly="True" Width="50"/>
<DataGridComboBoxColumn Header="DepartmentCode" SelectedItemBinding="{Binding Department, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="DepartmentCode" Width="120">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.Departments}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.Departments}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridTextColumn Header="DepartmentName" Binding="{Binding Department.DepartmentName}" IsReadOnly="True" Width="*"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid AutoGenerateColumns="False" SelectionMode="Single" CanUserAddRows="False"
ItemsSource="{Binding Departments}" Grid.Column="1" Width="250" AlternatingRowBackground="#F1F1F1">
<DataGrid.Columns>
<DataGridTextColumn Header="Code" Binding="{Binding DepartmentCode}" IsReadOnly="True" Width="100"/>
<DataGridTextColumn Header="Name" Binding="{Binding DepartmentName}" IsReadOnly="True" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
由于整个
Department
模型绑定到 的 SelectItemComboBox
,
当在 中选择了 'DepartmentCode' 时,会自动绑定 'DepartmentName'ComboBox
。
推荐阅读
- html - 使用 tempdata 属性的 toastr 通知不起作用
- locking - 如何用 webpy 做 DB 或 table 锁
- angular - 从内容 Content-Disposition 下载带有名称的 Angular 文件
- python - 需要帮助使用 tkinter 与多个 MySql 表进行交互
- javascript - 我们什么时候应该/不应该使用 Ember 模型来显示数据?
- haskell - 无法将预期类型“a”与实际类型“[a]”匹配
- numpy - Pytorch TypeError - eq() 收到了无效的参数组合
- c# - 无法加载文件或程序集 CMS.DataEngine - 在 Kentico 11.0.0 升级到 Kentico 12 SP1 之后
- tensorflow - 如何使用安装在 GCP 中的 ubuntu OS 创建深度学习 VM 实例?
- android - 无法解析 com.android.tools.build:gradle:3.6.3