2017-07-28 89 views
0

我有一個綁定:如何從視圖模型中更新綁定到DataContext?

<TextBlock Text="{Binding Converter={local:Converter}}" /> 

與轉換器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    var vm = (ViewModel)value; 
    return vm.SomeProperty; 
} 

更改SomeProperty不更新屏幕上的價值。轉換器不被調用。

如何從視圖模型中更新此類綁定?

注意:在實際項目中,轉換器將用於執行一些計算和返回結果。事實上,它甚至會是MultiBinding與不同視圖模型的類似綁定。我遇到了問題,並能夠將案例縮小到一個簡單的Binding,其中綁定不用於綁定到屬性,但是像這樣。


MCVE XAML:

<StackPanel> 
    <TextBlock Text="{Binding Converter={local:Converter}}" /> 
    <Button Content="..." Click="Button_Click" /> 
</StackPanel> 

和代碼:

public partial class MainWindow : Window 
{ 
    ViewModel _vm = new ViewModel(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = _vm; 
    } 

    void Button_Click(object sender, RoutedEventArgs e) => _vm.SomeProperty += "b"; 
} 

public class ViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string property) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); 

    string _someProperty = "a"; 
    public string SomeProperty 
    { 
     get { return _someProperty; } 
     set 
     { 
      _someProperty = value; 
      OnPropertyChanged(nameof(SomeProperty)); 
     } 
    } 
} 

public class Converter : MarkupExtension, IValueConverter 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) => this; 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var vm = (ViewModel)value; 
     return vm.SomeProperty; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

使用MultiBinding。 – Clemens

+0

@Clemens,其實我的問題始於'MultiBinding',它沒有奏效,然後我將問題縮小到正常綁定。 – Sinatr

+0

正如你從答案中可以看到的,目前還不清楚爲什麼你會這樣做,當你可以直接綁定到該屬性。你應該添加一些解釋你的方法背後的推理。 – Clemens

回答

0

如果ViewModel設置爲視圖的DataContext。你可以通過使用<TextBlock Text="{Binding SomeProperty}" />

簡單地綁定屬性。如果你要綁定整個視圖模型,那麼轉換器會做更多的事情,而不僅僅是轉換類型或者一些東西。看看這個:answer

+0

故事的要點並非對物業有約束力。在實際的項目中,轉換器會使用不同的屬性(甚至不同的視圖模型)和返回結果來做一些複雜的事情 – Sinatr

+0

然後添加更多詳細信息,因爲您的轉換器僅從ViewModel返回屬性。在ViewModel屬性也是一個'字符串'所以沒有轉換器是需要的 – dstreissi

+0

ai看到,那麼也許這會幫助你:https://stackoverflow.com/a/19955529/8374986 – dstreissi