WPF重复问题(MVVM)

WPF重复问题(MVVM),wpf,mvvm,Wpf,Mvvm,目前,我的模型有十个属性,出于我们在这里的目的,我将调用AnnualizedRate1,AnnualizedRate2,…,AnnualizedRate10,它们通过十个属性Rate1,Rate2,…,Rate10显示给视图模型中的视图。我的一个视图在数据网格中显示了这些值。这是非常重复和痛苦的,以适应不断变化的需求。必须有比下面更好的方法 型号(MyModel): 其中MyModel.AnnualizedRate为 public decimal AnnualizedRate(int i);

目前,我的模型有十个属性,出于我们在这里的目的,我将调用
AnnualizedRate1
AnnualizedRate2
,…,
AnnualizedRate10
,它们通过十个属性
Rate1
Rate2
,…,
Rate10
显示给视图模型中的视图。我的一个视图在
数据网格中显示了这些值。这是非常重复和痛苦的,以适应不断变化的需求。必须有比下面更好的方法

型号(
MyModel
):

其中
MyModel.AnnualizedRate

public decimal AnnualizedRate(int i);
视图模型(
MyViewModel
):

视图(
MyView
):

xmlns:dg=”http://schemas.microsoft.com/wpf/2008/toolkit"
...
...

有人有什么想法吗?

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

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

下面是RB Davidson所说的代码。当你发现这是你想要的,请给他信用。他的回答是正确的

在ViewModel中:

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
     }
}

}
public类AnnualizedRateViewModel
{
公共字符串名称{get;set;}
公共十进制率{get;set;}
}
公共MyViewModel:INotifyPropertyChanged
{
公共MyViewModel()
{
年化数据=新的可观测集合();
//我建议您的模型使用GetAllRates()函数,而不是这样,
//但为了演示的目的,这是可行的

对于(int i=1;i这是执行RB Davidson所说的操作的代码。当你发现这符合你的要求时,请相信他。他的回答是正确的

在ViewModel中:

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
     }
}

}
public类AnnualizedRateViewModel
{
公共字符串名称{get;set;}
公共十进制率{get;set;}
}
公共MyViewModel:INotifyPropertyChanged
{
公共MyViewModel()
{
年化数据=新的可观测集合();
//我建议您的模型使用GetAllRates()函数,而不是这样,
//但为了演示的目的,这是可行的


对于(int i=1;我请详细说明。我不知道如何使用这个。我不明白他为什么被否决。这是正确的答案。我会为你写代码,但否决他有点垃圾。明白了。很难说。请详细说明。我不知道如何使用这个。我不明白他为什么被否决。这是正确的答案。我会为你编写代码,但否决他有点垃圾。明白了。很难说清楚。我不确定戴维森的意思是绑定专栏而不是项目-至少他的回答没有提到这一点。我认为这是暗示。策略是合理的,他不应该得到所有的否决票。要求澄清是好的,但他也被否决了,这是我的think有点苛刻。我很可能弄错了,但我不认为WPF Toolkit DataGrid.Columns属性有ItemsControl属性。我相信您将GridView与DataGrid混淆了。如果我错了,请原谅我。ItemsControl是一个类似于通用转发器的控件。因为您可以编写我需要的任何内容n WPF,我正在将一个ItemsControl插入到您的Columns集合中,该集合应该可以自己生成列。这里有更多关于ItemsControl的信息:。正如我所说的……这可能不是100%正确,但至少有95%正确。@Anderson Imes:感谢您对我答案的支持。是的,我的意思是暗示绑定到列,而不是我tems。老实说,即使我知道我建议的方法是正确的,我也很难产生你所做的代码。我在WPF方面充其量是平庸的。因此,即使我最初的想法是正确的,我认为你提供了更有用、更准确的答案,值得称赞。我不确定戴维森的意思是绑定列d项-至少他的回答没有提到这一点。我认为这是隐含的。策略是合理的,他不值得所有的否决票。要求澄清是好的,但他也被否决了,我认为这有点苛刻。我很可能是错的,但我不认为WPF Toolkit DataGrid.Columns属性有一个ItemsControl属性。我相信您混淆了GridView和DataGrid。如果我错了,请原谅我。ItemsControl是一个类似于通用转发器的控件。因为您可以在WPF中编写任何内容,所以我将在您的Columns集合中插入一个ItemsControl,它应该会自动生成列。有关ItemsControl的更多信息,请参阅re:。就像我说的……这可能不是100%正确,但至少有95%是正确的。@Anderson Imes:谢谢你支持我的回答。是的,我的意思是绑定到列而不是项。老实说,即使我知道我建议的方法是正确的,我也很难生成你所做的代码。我在WPF方面充其量只能算是平庸。因此,尽管我有一个正确的想法,但我认为你提供了更有用、更准确的答案,这是值得称赞的。到底什么是重复的——必须为这10个属性中的每一个分别定义和绑定一列?这是你想要摆脱的吗?他说他必须复制和粘贴这些属性Rate1到Rate10都是相同的xaml,只需更改索引号即可。根据事实判断,所有这些都是DataGrid.Columns属性中的DataGridTextColumn,我假设他有一个包含10列的网格,他想用一种方法使列的代码更简洁。@Anderson Imes:您理解了问题和目标c没错。这对你来说是怎么回事?到底什么是重复的?必须为这10个属性中的每一个分别定义和绑定一列?这就是你想要摆脱的吗?他说他必须在Rate1到Rate10之间一遍又一遍地复制和粘贴相同的xaml,并且只需更改索引号。根据事实判断
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>
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
     }
}

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