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>