【问题标题】:WPF Repetition Question (MVVM)WPF 重复问题 (MVVM)
【发布时间】:2009-07-30 00:51:31
【问题描述】:

目前我的模型有十个属性,出于我们的目的,我将在这里调用AnnualizedRate1,AnnualizedRate2,...,AnnualizedRate10,它们通过十个属性在视图模型中显示给视图Rate1,@ 987654325@, ..., Rate10。我的一个观点在DataGrid 中显示了这些值。这是非常重复的,并且很难适应不断变化的需求。一定有比以下更好的方法。

型号 (MyModel):

public decimal AnnualizedRate1 { get { return this.AnnualizedRate(1); } }
public decimal AnnualizedRate2 { get { return this.AnnualizedRate(2); } }
...
public decimal AnnualizedRate10 { get { return this.AnnualizedRate(10); } }

MyModel.AnnualizedRate 在哪里

public decimal AnnualizedRate(int i);

查看模型 (MyViewModel):

public decimal Rate1 { get { return myModel.AnnualizedRate1; } }
public decimal Rate2 { get { return myModel.AnnualizedRate2; } }
...
public decimal Rate10 { get { return myModel.AnnualizedRate10; } }

查看(MyView):

xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
...
    <dg:DataGrid>
        <dg:DataGrid.Columns>
            <dg:DataGridTextColumn
                Header="Rate1" 
                Binding="{Binding Rate1, StringFormat=P}"
                IsReadOnly="True"/>
            <dg:DataGridTextColumn
                Header="Rate2" 
                Binding="{Binding Rate2, StringFormat=P}"
                IsReadOnly="True"/>
            ...
            <dg:DataGridTextColumn
                Header="Rate10" 
                Binding="{Binding Rate10, StringFormat=P}"
                IsReadOnly="True"/>
        </dg:DataGrid.Columns>
    </dg:DataGrid>

有人有什么想法吗?

【问题讨论】:

  • 究竟什么是重复 - 必须为这 10 个属性中的每一个分别定义和绑定一个列?这是你想要摆脱的吗?
  • 他说他必须为 Rate1 到 Rate10 一遍又一遍地复制和粘贴相同的 xaml,并且只需更改该索引号。从所有这些都是 DataGrid.Columns 属性中的 DataGridTextColumn 的事实来看,我假设他有一个包含 10 列的网格,并且他喜欢让列的代码更简洁。
  • @Anderson Imes:您正确理解了问题和目标。
  • 你的效果如何?

标签: wpf mvvm


【解决方案1】:

这是执行 RB Davidson 所说的代码。当您发现这可以满足您的要求时,请给予他信任。他的回答是正确的。

在您的视图模型中:

public class AnnualizedRateViewModel
{
     public string Name { get; set; }
     public decimal Rate { get; set; }
}

public MyViewModel : INotifyPropertyChanged
{

public MyViewModel()
{
     AnnualizedRates = new ObservableCollection<AnnualizedRateViewModel>();
     //I'd recommend your model having a GetAllRates() function rather than this,
     //but for demo purposes, this works
     for(int i = 1; i <= 10; i++)
     {
          AnnualizedRates.Add(new AnnualizedRateViewModel()
          {
               Name = string.Format("Rate {0}", i),
               Rate = MyModel.AnnualizedRate(i)
          });
     }
}

private ObservableCollection<int> _annualizedRates;
public ObservableCollection<int> AnnualizedRates
{
     get { return _annualizedRates; }
     set
     {
          _annualizedRates = value;
          //Raise OnNotifyPropertyChanged event from your
          //implementation of INotifyPropertyChanged in your viewmodel
          //the full implementation of this is outside the scope of this demo
     }
}

}

从那里您实际上可以使用数据绑定在视图中创建列。您将绑定到这个年化率集合。由于 WPF 工具包并不容易,因此您必须编写一个值转换器来将 ObservableCollection&lt;AnnualizedRateViewModel&gt; 转换为 ObservableCollection&lt;DataGridColumn&gt;。

<dg:DataGrid AutoGenerateColumns="false" Columns="{Binding AnnualizedRates, ValueConverter={StaticResource AnnualizedRatesToDataGridColumnCollectionConverter}}">
</dg:DataGrid>

您应该在这里学习的是,当您对自己思考“重复”时,请尝试改为思考“收集”。

祝你好运...再次感谢 RB Davidson。

【讨论】:

  • 我不确定戴维森的意思是绑定列而不是项目 - 至少他的回答没有提到这一点。
  • 我认为它是隐含的。这个策略是合理的,他不应该得到所有的反对票。要求澄清很好,但他也被否决了,我认为这有点苛刻。
  • 我很可能弄错了,但我认为 WPF Toolkit DataGrid.Columns 属性没有 ItemsControl 属性。我相信您将 GridView 与 DataGrid 混淆了。如果我错了,请原谅我。
  • ItemsControl 是一种类似于通用中继器的控件。由于您可以在 WPF 中编写任何内容,因此我将 ItemsControl 插入到您的 Columns 集合中,该集合应自行生成列。更多关于 ItemsControl 的信息:msdn.microsoft.com/en-us/library/…。就像我说的……这可能不是 100% 正确,但至少有 95% 的正确率。
  • @Anderson Imes:感谢您对我的回答的支持。是的,我的意思是暗示绑定到列而不是项。老实说,即使我知道我建议的方法是正确的,我也会很难生成你所做的代码。我充其量是WPF的平庸。因此,尽管我最初的想法是正确的,但我认为您提供了更有用和更准确的答案是值得称赞的。
【解决方案2】:

我会使用 ObservableCollection 来存储数据并将网格绑定到。

【讨论】:

  • 请详细说明。我没有看到如何使用它。
  • 我不明白他为什么被否决。这是正确的答案。我会为你写代码,但对他投反对票有点废话。
  • 明白了。在这里很难说。
猜你喜欢
  • 2010-12-15
  • 2014-02-16
  • 1970-01-01
  • 2011-08-02
  • 2018-06-08
  • 1970-01-01
  • 2015-06-04
  • 2011-09-18
相关资源
最近更新 更多