Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有计算值的组合框(MVVM)_C#_Wpf_Mvvm_Combobox - Fatal编程技术网

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());
        }
    }