C# 如何将IMultiValueConverter与MVVM模式结合使用?
我的viewmodel具有以下两个属性:C# 如何将IMultiValueConverter与MVVM模式结合使用?,c#,wpf,mvvm,C#,Wpf,Mvvm,我的viewmodel具有以下两个属性: public ValueType ValueType { get { return _valuetype; } set { _valuetype = value; OnPropertyChanged(); } } public double? Value { get { return _value; } set { _value = value; OnPropertyChanged(); } } ValueType是一个enum: public enu
public ValueType ValueType { get { return _valuetype; } set { _valuetype = value; OnPropertyChanged(); } }
public double? Value { get { return _value; } set { _value = value; OnPropertyChanged(); } }
ValueType
是一个enum
:
public enum ValueType
{
Currency,
Quotas
}
我想使用IMultiValueConverter
格式化一个文本框,该转换器根据我的ValueType
属性格式化我的Value
属性。如果ValueType
设置为ValueType.Currency
,我需要显示千位分隔符和两位小数,或者.ToString(“N2”)
;如果ValueType
设置为ValueType.quota
,我需要显示8位小数和千位分隔符,或者.ToString(“N8”)
。这是我的文本框:
<TextBox Width="250" TextAlignment="Right"
HorizontalAlignment="Left">
<TextBox.Text>
<MultiBinding Converter="{StaticResource CurrencyQuotaConverter}">
<Binding Path="ValueType" Mode="OneWay"/> <!--from my DataContext-->
<Binding Path="Value" Mode="TwoWay"/> <!--from my DataContext-->
</MultiBinding>
</TextBox.Text>
</TextBox>
您可以看到我的ConvertBack()
方法可能是错误的。MyValueType
属性绑定到两个单选按钮。更改其值可以很好地更新转换。如果我点击“货币”单选按钮,我的文本框将用2位小数格式化我的数字,否则,它将按预期显示8位小数。但问题是,ConvertBack()
方法从未更新我的viewmodel上的值
属性,也从未调用set
构造函数。更改文本框的值也不会触发转换器
我的问题是:如何使用IMultiValueConverter保持视图格式正确,并且始终更新视图模型?有可能吗?我是否应该找到另一种解决方案?将FormattedValue属性添加到视图模型可能更简单。将模式更改为双向@Clemens,然后将FormattedValue属性绑定到我的文本框?如何更新Value属性?@aepot我的第二个绑定始终是双向模式。您是指多重绑定吗?在FormattedText属性的setter中,您将根据ValueType解析字符串,并相应地设置值。
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
ValueType _valuetype = (ValueType)values[0];
if (values[1] == null) return null; //My Value property is nullable
double _value = double.Parse(values[1].ToString());
return _valuetype == ValueType.Currency ? _value.ToString("N2") : _value.ToString("N8");
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
object[] returnedvalue = { null, null };
returnedvalue[1] = value; //Only my second bound value is twoway mode.
return returnedvalue;
}