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

标签 c# wpf xaml mvvm datagrid

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

相关文章:

wpf - XAML 中的字符串插值

C# 存储信息

c# - 整数与 double 算术性能?

c# - C# 中的不可变本地 'variables'

wpf - 如何使用 WCF RIA 服务在 WPF 中进行客户端验证

c# - 聚焦时的 UWP 文本框背景

c# - 如何在 UWP 应用程序中保留 TextBlock 的空白

c# - 在 C# 中对 List<Tuple<int,int>> 进行二进制搜索

.net - Silverlight 本地化 - 如何覆盖 Windows 区域性

wpf - 样式 WPF/Silverlight 组合框