属性在我使用转换器更新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时未更新

如果你想让你在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接口到你的属性,这就是为什么属性不更新受影响的值。