我使用转换器更新UI时未更新属性

时间:2016-09-16 11:57:49

标签: c# wpf mvvm

我使用Converter将属性显示到XAML MVVM视图中。

   <xctk:DoubleUpDown  Value="{Binding CurrentIndex, Converter={StaticResource IndexToNumberConverter}} />

当代码更新属性时,调用IndexToNumberConverter.Convert(...)方法并按预期运行。

我希望从UI更新控件时属性会更新。 这不是发生的事情。 而是调用控制器的COnvertBack方法,并且不运行属性设置器。

我想,如果我将我的属性作为转换器的参数传递,然后实现转换器convertBack方法来执行相应的工作,它将起作用。 但我很确定这不是正确的方法:)

在更新UI控件时,是否有更简单的方法来更新我的属性?

提前谢谢。

2 个答案:

答案 0 :(得分:3)

如果您希望UI上的更改反映在ViewModel上,则需要双重绑定。我不知道你的控件是做什么的,但我会用TextBox显示它。

<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" />

Mode=TwoWay使此TextBox能够在UI上触发对ViewModel所做的更改。 TwoWay模式是TextBox的默认模式,我不知道默认情况下是否在您的控件上启用了它。

如果您使用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

我希望这会有所帮助,否则我建议您使用更相关的代码更新您的问题。

答案 1 :(得分:-1)

从您的查询中我了解到,当您从ui设置时,该属性不会转换回来。我认为问题是你没有在你的属性中实现iPropertyChange接口,这就是为什么属性没有更新受影响的值。