C# 具有计算值的组合框(MVVM)
有人能帮我吗? 首先,我写一个简单的例子,让你们能更好地理解我 比如说,我有这样的虚拟机: 我的数据上下文:C# 具有计算值的组合框(MVVM),c#,wpf,mvvm,combobox,C#,Wpf,Mvvm,Combobox,有人能帮我吗? 首先,我写一个简单的例子,让你们能更好地理解我 比如说,我有这样的虚拟机: 我的数据上下文: public class MainWindowVM { private List<DocRow> _rows; public List<DocRow> DocumentRows { get { return _rows ?? (_rows = new List<DocRow&g
public class MainWindowVM
{
private List<DocRow> _rows;
public List<DocRow> DocumentRows
{
get
{
return _rows ?? (_rows = new List<DocRow>()
{
new DocRow(new Employee(1,"Employee1"),200,4,2),
new DocRow(new Employee(2,"Employee2"),400,8,0)
});
}
}
}
我的看法是:
<Window x:Class="TestComboboxUserControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestComboboxUserControl"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainWindowVM/>
</Window.DataContext>
<Grid>
<DataGrid
ItemsSource="{Binding DocumentRows}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Employee">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding EmployeeList}"
SelectedItem="{Binding Employee,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Salary">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Salary,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="A-Bonus">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding EmployeeList}"
SelectedItem="{Binding ABonus,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="B-Bonus">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding EmployeeList}"
SelectedItem="{Binding BBonus,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
我重复一遍,这只是一个例子
我有什么问题:
在我公司的业务逻辑中,ABonus只能有两个值中的一个:2%*薪水或0%*薪水
B-奖金,反过来只能有两个值,0.5%*薪水或0%*薪水
我想要的是:
我想创建一个usercontrol,我可以这样使用:
<DataGridTemplateColumn Header="B-Bonus">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<cbb:ComboBoxCalculated SelectedItem="{Binding BBonus,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ComboboxCalculated.PredefinedPercent>
<CbbItem Value = "0%"/>
<CbbItem Value = "2%"/>
</ComboboxCalculated.PredefinedPercent>
</cbb:ComboBoxCalculated>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
看起来是这样的:
当然,我的虚拟机必须提高OnProperty更改的A奖金和B奖金项目,以便重新计算
在模型中必须插入组合框的“selectedItem”吗?例如,值必须是200。
当从数据库加载时,所选项目必须更改为。
对不起,我的英语不好,我希望你能理解我
在此组合框中,始终只能有两项,0%和“x”%
如果你能说我一个最好的和用户友好的方式来做这个功能,请告诉我。
谢谢大家我不确定我是否理解您在寻找什么,但我认为您应该在输入过程中更改条目。意味着当您更改“工资”中的值时,您应该更新viewmodel中“A-奖金”和“B-奖金”列表中的项目 也许这里有一个我的应用程序的小例子。这是一个有netto和brutto价值观的价格,但我真的只持有netto价值观 -当netto值更改时,我只触发brutto属性更改事件 -当brutto值更改时,我更改netto数据模型值并仅触发netto属性更改事件
/// <summary>price purchase netto</summary>
[DefaultValue(null)]
[JsonIgnore]
[Validation.RequiredIf("Class", ErrorMessageResourceType = typeof(CarPlus.Base.Properties.Resources), ErrorMessageResourceName = "General_Required")]
[Range(0, 10000000, ErrorMessageResourceType = typeof(CarPlus.Base.Properties.Resources), ErrorMessageResourceName = "ViewModelVehicle__PriceRange")]
public decimal? PricePurchaseNetto
{
get
{
return (this.__dataModel.PricePurchaseNetto);
}
set
{
if (this.__dataModel.PricePurchaseNetto != value)
{
this.__dataModel.PricePurchaseNetto = value;
this.RaisePropertyChanged("PricePurchaseNetto");
Log.Logger.DebugFormat("{0}:{1} - set('{2}')", this.FullName, MethodBase.GetCurrentMethod().Name, value == null ? "NULL" : value.ToString());
this.RaisePropertyChanged("PricePurchaseBrutto");
}
}
}
//-------------------------------------------------------------------------------------
/// <summary>price purchase brutto</summary>
[DefaultValue(null)]
[JsonIgnore]
[Validation.RequiredIf("Class", ErrorMessageResourceType = typeof(CarPlus.Base.Properties.Resources), ErrorMessageResourceName = "General_Required")]
[Range(0, 10000000, ErrorMessageResourceType = typeof(CarPlus.Base.Properties.Resources), ErrorMessageResourceName = "ViewModelVehicle__PriceRange")]
public decimal? PricePurchaseBrutto
{
get
{
return (Helpers.GetBrutto(this.__dataModel.PricePurchaseNetto, this.VatVerifiable && !this.VatImportWithout ? this.VatPurchase : null));
}
set
{
this.__dataModel.PricePurchaseNetto = Helpers.GetNetto(value, this.VatVerifiable && !this.VatImportWithout ? this.VatPurchase : null);
this.RaisePropertyChanged("PricePurchaseNetto");
Log.Logger.DebugFormat("{0}:{1} - set('{2}')", this.FullName, MethodBase.GetCurrentMethod().Name, value == null ? "NULL" : value.ToString());
}
}
///净价购买
[默认值(空)]
[JsonIgnore]
[Validation.RequiredIf(“Class”,ErrorMessageResourceType=typeof(CarPlus.Base.Properties.Resources),ErrorMessageResourceName=“General_Required”)]
[Range(0,10000000,ErrorMessageResourceType=typeof(CarPlus.Base.Properties.Resources),ErrorMessageResourceName=“ViewModelVehicle\uuuu PriceRange”)]
公共小数?普莱斯
{
得到
{
返回(此.uu dataModel.PricePurchaseNetto);
}
设置
{
if(this.\uu dataModel.PricePurchaseNetto!=值)
{
这是.\uu dataModel.PricePurchaseNetto=值;
本.RaisePropertyChanged(“PricePurchaseNetto”);
Log.Logger.DebugFormat(“{0}:{1}-set(“{2}”)”,this.FullName,MethodBase.GetCurrentMethod().Name,value==null?“null”:value.ToString());
本.RaisePropertyChanged(“PricePurchaseBrutto”);
}
}
}
//-------------------------------------------------------------------------------------
///购买价格
[默认值(空)]
[JsonIgnore]
[Validation.RequiredIf(“Class”,ErrorMessageResourceType=typeof(CarPlus.Base.Properties.Resources),ErrorMessageResourceName=“General_Required”)]
[Range(0,10000000,ErrorMessageResourceType=typeof(CarPlus.Base.Properties.Resources),ErrorMessageResourceName=“ViewModelVehicle\uuuu PriceRange”)]
公共小数?购买价格
{
得到
{
return(Helpers.GetBrutto(this.\u dataModel.PricePurchaseNetto,this.VatVerifiable&!this.VatImportWithout?this.VatPurchase:null));
}
设置
{
this.\uu dataModel.PricePurchaseNetto=Helpers.GetNetto(value,this.VatVerifiable&!this.VatImportWithout?this.VatPurchase:null);
本.RaisePropertyChanged(“PricePurchaseNetto”);
Log.Logger.DebugFormat(“{0}:{1}-set(“{2}”)”,this.FullName,MethodBase.GetCurrentMethod().Name,value==null?“null”:value.ToString());
}
}
/// <summary>price purchase netto</summary>
[DefaultValue(null)]
[JsonIgnore]
[Validation.RequiredIf("Class", ErrorMessageResourceType = typeof(CarPlus.Base.Properties.Resources), ErrorMessageResourceName = "General_Required")]
[Range(0, 10000000, ErrorMessageResourceType = typeof(CarPlus.Base.Properties.Resources), ErrorMessageResourceName = "ViewModelVehicle__PriceRange")]
public decimal? PricePurchaseNetto
{
get
{
return (this.__dataModel.PricePurchaseNetto);
}
set
{
if (this.__dataModel.PricePurchaseNetto != value)
{
this.__dataModel.PricePurchaseNetto = value;
this.RaisePropertyChanged("PricePurchaseNetto");
Log.Logger.DebugFormat("{0}:{1} - set('{2}')", this.FullName, MethodBase.GetCurrentMethod().Name, value == null ? "NULL" : value.ToString());
this.RaisePropertyChanged("PricePurchaseBrutto");
}
}
}
//-------------------------------------------------------------------------------------
/// <summary>price purchase brutto</summary>
[DefaultValue(null)]
[JsonIgnore]
[Validation.RequiredIf("Class", ErrorMessageResourceType = typeof(CarPlus.Base.Properties.Resources), ErrorMessageResourceName = "General_Required")]
[Range(0, 10000000, ErrorMessageResourceType = typeof(CarPlus.Base.Properties.Resources), ErrorMessageResourceName = "ViewModelVehicle__PriceRange")]
public decimal? PricePurchaseBrutto
{
get
{
return (Helpers.GetBrutto(this.__dataModel.PricePurchaseNetto, this.VatVerifiable && !this.VatImportWithout ? this.VatPurchase : null));
}
set
{
this.__dataModel.PricePurchaseNetto = Helpers.GetNetto(value, this.VatVerifiable && !this.VatImportWithout ? this.VatPurchase : null);
this.RaisePropertyChanged("PricePurchaseNetto");
Log.Logger.DebugFormat("{0}:{1} - set('{2}')", this.FullName, MethodBase.GetCurrentMethod().Name, value == null ? "NULL" : value.ToString());
}
}