私が結合している:コンバータとビューモデル内から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();
}
}
マルチバインディングを使用してください。 – Clemens
@Clemens、実際に私の問題は、動作しなかった 'MultiBinding'で始まり、問題を通常のバインディングに絞り込みました。 – Sinatr
答えからわかるように、なぜあなたはそのプロパティに直接バインドすることができるのか、なぜこれを行うのかは明らかではありません。あなたのアプローチの背後にある推論の説明を追加する必要があります。 – Clemens