2016-09-16 65 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 –