我正在开发一个带有手动定义列的 DataGrid 的 WPF 应用程序。
在该 DataGrid 中,用户应该能够输入包括下限(十进制值)和比较符号(“<”或“<=”)的数据。
DataGrid 本身绑定(bind)到名为 StepDataSource 的 ObservableCollection:
/// <summary>
/// Gets or sets the data of the stepfunction.
/// </summary>
public ObservableCollection<StepData> StepDataSource
{
get { return stepdataSource; }
set
{
stepdataSource = value;
RaisePropertyChanged("StepDataSource");
}
}
StepData 类——不是 View 模型的一部分——包含以下属性:
/// <summary>
/// Gets or sets the lower bound.
/// </summary>
public double LowerBound { get; set; }
/// <summary>
/// Gets or sets the assigned value.
/// </summary>
public double StepValue { get; set; }
/// <summary>
/// Gets or sets the lower comparer.
/// </summary>
public ArithmeticSignData LowerComparer2 { get; set; }
在 ComboBox 中选择的项目需要最后一个属性 LowerComparer2。
我在 DataGrid 中的一列是 DataGridComboBoxColumn,它绑定(bind)到我的 View 模型中的另一个 ObservableCollection:
public ObservableCollection<ArithmeticSignData> LowerComparers2 { get; set; }
ArithmeticSignData 类包含组合框应使用的键和值的属性。
public class ArithmeticSignData
{
/// <summary>
/// The constructor.
/// </summary>
/// <param name="key">The key.</param>
/// <param name="value">The value.</param>
public ArithmeticSignData(string key, string value)
{
ArithmeticSignKey = key;
ArithmeticSignValue = value;
}
public string ArithmeticSignKey { get; set; }
public string ArithmeticSignValue { get; set; }
}
在 View 模型中,我正在填充该集合:
LowerComparers2 = new ObservableCollection<ArithmeticSignData>();
LowerComparers2.Add(new ArithmeticSignData("1", "<"));
LowerComparers2.Add(new ArithmeticSignData("2", "<="));
然后我像这样定义了DataGrid中的列:
<DataGrid x:Name="grd_stepdata"
Grid.Row="0"
Grid.Column="0"
Margin="5"
AutoGenerateColumns="False"
CanUserAddRows="True"
CanUserDeleteRows="True"
SelectionUnit="FullRow"
ItemsSource="{Binding StepDataSource, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridComboBoxColumn x:Name="col_LowerComparer2"
SelectedItemBinding="{Binding LowerComparer2, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="ArithmeticSignValue"
Header="LowComp"/>
</DataGrid.Columns>
</DataGrid>
通过本论坛中的一些文章,我了解到必须在代码隐藏中设置 ItemsSource:
col_LowerComparer2.ItemsSource = vm.LowerComparers2;
当我启动应用程序并选择一个项目时,我可以在我的 viewmodel-property LowerComparer2 中看到具有正确键和值的所选项目。
但不幸的是,在我启动应用程序后,我无法从列中的 View 模型中看到现有数据。
我是否忘记了一个或多个属性?
最佳答案
试试这个:
<DataGridComboBoxColumn x:Name="col_LowerComparer2"
SelectedItemBinding="{Binding LowerComparer2, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="ArithmeticSignValue"
Header="LowComp">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.LowerComparers2, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.LowerComparers2, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
还要注意
StepData
的 LowerComparer2 属性返回的对象对象必须存在于 MainViewModelClass
的 LowerComparers2 集合中要选择的项目。这意味着您不能将此属性设置为新的 ArithmeticSignData
目的。您应该将其设置为 ArithmeticSignData
中的任何一个已经添加到 LowerComparers2 集合中的对象:using System.Linq;
...
public MainWindow()
{
// The window components are initialized.
InitializeComponent();
// DataContext gets the viewmodel.
DataContext = vm;
vm.StepDataSource.Add(new StepData("<", 0, 0, vm.LowerComparers2.FirstOrDefault(x => x.ArithmeticSignKey == "1")));
vm.StepDataSource.Add(new StepData("<=", 0.1, 0.8, vm.LowerComparers2.FirstOrDefault(x => x.ArithmeticSignKey == "2")));
vm.StepDataSource.Add(new StepData("<", 0.2, 1.2, vm.LowerComparers2.FirstOrDefault(x => x.ArithmeticSignKey == "1")));
vm.StepDataSource.Add(new StepData("<=", 0.3, 1.4, vm.LowerComparers2.FirstOrDefault(x => x.ArithmeticSignKey == "2")));
ChartDataRefresh();
...
}
关于c# - 在绑定(bind)到 ObservableCollection 的 WPF DataGridComboBoxColumn 中看不到现有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41854153/