2017-07-28 8 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

マルチバインディングを使用してください。 – Clemens

+0

@Clemens、実際に私の問題は、動作しなかった 'MultiBinding'で始まり、問題を通常のバインディングに絞り込みました。 – Sinatr

+0

答えからわかるように、なぜあなたはそのプロパティに直接バインドすることができるのか、なぜこれを行うのかは明らかではありません。あなたのアプローチの背後にある推論の説明を追加する必要があります。 – Clemens

答えて

0

ViewModelは、ビューのDataContextに設定されている場合。 <TextBlock Text="{Binding SomeProperty}" />

コメントから、コンバータがタイプを変換するだけでなく、何かを行うので、viewModel全体をバインドするとしたら、コメントからです。これを見てください:answer

+0

ストーリー全体がプロパティにバインドされていません。実際のプロジェクトコンバータでは、異なるプロパティ(異なるビューモデルでも)を使用して結果を返す複雑な作業を行います。 – Sinatr

+0

次に、コンバータがViewModelからプロパティを保持しているだけなので、詳細な情報を追加してください。 ViewModelではプロパティも 'string'なので、変換器は必要ありません – dstreissi

+0

ai参照、これはあなたを助けるでしょう:https://stackoverflow.com/a/19955529/8374986 – dstreissi

関連する問題