2016-09-16 64 views
-1

我正在使用Converter将属性显示到XAML MVVM视图中。如预期中调用,运行使用转换器更新UI时属性未更新

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

当代码更新的特性,IndexToNumberConverter.Convert(...)方法。

我本来料想到,当我从UI更新控件时,属性会更新。 这不是发生了什么事。 而是,调用控制器的COnvertBack方法,并且属性设置器不运行。

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

是否有更简单的方法来更新我的财产,当我更新UI控制?

Thx提前。

+0

当数据从视图模型流向视图时转换运行。 ConvertBack在数据从视图流向模型时运行。如果你想支持双向绑定,你必须实现两者。您的ConvertBack方法必须将视图中的数据转换为视图模型的相应数据,否则将不会保存。由于你还没有显示,我不能说你的问题可能是什么。 – Will

回答

3

如果您希望在UI上进行更改以反映您的ViewModel,则需要双向绑定。我不知道你的控制是干什么的,但我会用TextBox来显示它。

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

Mode=TwoWay使此文本框可以触发在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到视图模型只需要指定Mode=OneWayToSource

我希望这可以帮助,否则我建议你用更相关的代码更新你的问题。

+0

谢谢你的解释巴特:) –

+0

不客气! – Bart

-1

由于您的查询我已经了解,当您从UI设置时,属性不会转回。我认为问题是您没有将iPropertyChange接口实现到您的属性中,这就是为什么该属性未更新受影响的值。

+0

实际上,Ionly希望更新UI控件时更新绑定属性。就好像没有转换器一样。 但是,当代码更新属性时,确实需要应用转换器。 –

+0

您还必须使用转换方法。在你的viewmodel中或者你已经创建了属性的地方,应该实现INotiFicationPropertyChanged接口。 –

+0

请参阅此链接查看属性notificatio.https://msdn.microsoft.com/en-us/library/ms743695(v = vs.110)。aspx –