属性在我使用转换器更新UI时未更新
本文关键字:更新 UI 转换器 属性 | 更新日期: 2023-09-27 18:07:24
我正在使用Converter将属性显示为XAML MVVM视图。
<xctk:DoubleUpDown Value="{Binding CurrentIndex, Converter={StaticResource IndexToNumberConverter}} />
当代码更新属性时,调用IndexToNumberConverter.Convert(…)方法并按预期运行。
我希望属性在我从UI更新控件时更新。事实并非如此。相反,将调用控制器的COnvertBack方法,而不运行属性设置器。
我想,如果我传递我的属性作为转换器的参数,然后实现转换器的convertBack方法来做适当的工作,它将工作。但我很肯定,这不是正确的方式进行:)
有没有更简单的方法来更新我的属性当我更新UI控件?
如果你想让你在UI上的改变反映到你的ViewModel上,你需要一个双向绑定。我不知道你的控件是做什么的,但是我会用一个文本框来显示它。
<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" />
Mode=TwoWay
使这个TextBox能够触发UI上的更改返回到ViewModel。双向模式在文本框上是默认的,我不知道它在你的控件上是否默认启用。
如果使用ValueConverter,则需要实现ConvertBack,就像前面提到的那样。同样,不知道你的代码看起来像什么,但像这样的东西将工作。
public class IndexToNumberConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int index = Convert.ToInt32(value);
switch(index)
{
case 0:
return "ZERO";
case 10:
return "TEN";
default:
return "OTHER";
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string val = value.ToString();
switch(val)
{
case "ZERO":
return 0;
case "TEN":
return 10;
default:
return -1;
}
}
}
然后,绑定控件看起来像这样:
<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IndexToNumberConverter} }" />
如果你希望你的绑定只从UI到ViewModel,你需要指定Mode=OneWayToSource
。
我希望这对你有帮助,否则我建议你用更相关的代码更新你的问题。
根据您的查询,我已经了解到,当您从ui设置时,该属性不会转换回来。我认为问题是你没有实现iPropertyChange接口到你的属性,这就是为什么属性不更新受影响的值。