【问题标题】:A way to bind differents values of a property in each DataGrid cell一种在每个 DataGrid 单元格中绑定不同属性值的方法
【发布时间】:2014-06-20 10:45:01
【问题描述】:

我搜索了很多线程,但找不到任何可以解决我的问题的方法,而且我真的不知道应该使用哪些关键字。我有一个由 DataSet 填充的 DataGrid,其中包含我手动指定的列。

在我的专栏“总计”中,绑定设置为:

<DataGridTextColumn Header="Total"
         Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                   AncestorType={x:Type UserControl}},
                   Path=DataContext.Total}"

Total 属性不在绑定到我的 DataGrid 的 DataSet 中,这就是我使用这种 Binding 的原因。

问题是,当我在“总计”单元格中设置一个值时,就像任何用户所做的那样,该值会在我的列的每个单元格中重复。

所以,我知道这是因为这个属性,因为每次我更改单元格的值时,Total 属性都会获取这个新值并将其发送回我的列。我可以使用使用所选行号或其他内容的条件,我对我应该做什么有一些想法,但我不能在我的 Xaml 代码中这样做。

我尝试在后面的代码中创建一个 Binding(),但它并没有真正起作用,我不确定它是否可以改变任何东西。

在这种情况下,有没有办法每行使用一个值?

谢谢!

【问题讨论】:

  • 最简单的方法是不使用 DataSet 而是使用自定义类来表示您的数据。然后,您可以添加一个表示其他字段总数的属性并将您的列绑定到该属性。这也将支持使用 MVVM 设计模式msdn.microsoft.com/en-us/magazine/dd419663.aspx
  • @LeeO。嘿,感谢您的链接,我在几个月前开始使用 WPF 时尝试阅读该链接。不幸的是,我别无选择,只能使用 DataSet,这就是我没有尝试其他方法的原因。实际上是代表其他字段的总和,但是在我的列中的每个单元格中,这就是问题所在。
  • 向 DataSet 中的 DataTable 添加一列,该列使用表达式计算其值并将总列绑定到该列。 msdn.microsoft.com/en-us/library/…
  • 好的,我不确定我是否可以修改我的数据集,但我会试一试,谢谢你的提示。我想没有其他解决方案?
  • 您还可以对总列使用多重绑定,并将其绑定到您要汇总的列所绑定的所有相同绑定。然后创建一个 IMultiValueConverter 来汇总这些值。

标签: wpf xaml binding datagrid


【解决方案1】:

所以,正如 Lee O. 所说,我首先决定通过在其中添加一个新列和一些数据来更改我的 DataSet。问题是我在设计器代码的第二列上找不到任何方法来成功绑定。

无论如何,我知道这不是最好的方法,因为我有点阻止自己修改一些大的东西以避免代码中的大问题以及其他一些原因,所以我花了一整天的时间让它更好地工作。我认为修改它可能不会花费这么多时间,但它终于奏效了。

解决方案是创建(或在我的情况下更改)一个代表 DataGrid 中的一行的类,该类具有您需要的任意数量的属性,包括您可能想要拥有的每一列。然后,在您的 ViewModel 中创建一个 ObservableCollection(我真的很喜欢这种类型的列表,非常有用且易于使用/更新)。

最后,像这样将你的列绑定到你的 MainWindow 类中的属性:

// new ViewModel() + ObservableCollection<Class>
this.gridCameras.ItemsSource = viewModel.OCCameras;
this.Total.Binding = new Binding("Total");

如果它也可以帮助某人,我发现可以将此类正确绑定到 DataGrid 中的 ComboBox,这有点复杂,herehere 因为我想你的 ComboBox 应该这样写(不要忘记 foreach 循环中使用的 x:Name 属性):

<DataGridTemplateColumn Header="Fps" Width="80" x:Name="Fps">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox x:Name="cbFps"
                      Foreground="Black"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我强烈建议您在类中添加 Index 属性,因为当我编辑单元格/行和其他一些内容时,我会使用它来识别 ObservableCollection 中的对象。这比在每次需要时都在列表中循环直到找到元素要好得多。

希望对您有所帮助,如有任何问题,请随时提出。我并不是说我使用了世界上最好的方式,但它对我有用,这就是我想要的。

再次感谢 Lee O 的提示。

【讨论】:

  • 这是一个不错的进展。我认为您的下一步应该是学习如何在 xaml 后面的代码中执行您正在执行的操作。我很高兴你能顺利度过这个难关!
  • 好的,谢谢!实际上,由于我的 C# 经验,我更喜欢通过使用代码而不是 Xaml 来启动 WPF。不是最好的方法,相当困难,但很有启发性。
猜你喜欢
  • 2017-03-06
  • 2015-05-29
  • 1970-01-01
  • 2011-09-02
  • 2011-10-29
  • 1970-01-01
  • 2021-10-23
  • 2017-10-04
  • 2013-04-21
相关资源
最近更新 更多