gpt4 book ai didi

c# - 在绑定(bind)到 ObservableCollection 的 WPF DataGridComboBoxColumn 中看不到现有数据

转载 作者:行者123 更新时间:2023-12-03 11:03:33 25 4
gpt4 key购买 nike

我正在开发一个带有手动定义列的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com