0

コードでプロパティバインディング(WPF)を設定しようとしています。コードは正常にコンパイルされますが、バインドするプロパティが設定されることはありません。以下は最小限の例です。

ビューモデル:

public class FooViewModel: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _value;
    public string Value 
    { 
        get { return _value; }
        set
        {
            _value = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Value"));
        }
    }
}

景色:

public class FooView: Window
{
    public string Value
    {
        get { return Title; }
        set
        {
            // Breakpoint here never hits!
            Title = value;
        }
    }

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(FooView));

    public FooView()
    {
        Binding valueBinding = new Binding("Value");
        valueBinding.Mode = BindingMode.OneWay;
        SetBinding(ValueProperty, valueBinding);
    }
}

「main()」:

        FooView view = new FooView();
        FooViewModel model = new FooViewModel();
        view.DataContext = model;
        view.Show();
        model.Value = "ABC";

FooView.Valueが設定されているときに-setterが呼び出されることを期待していましたmodel.ValueBinding.Sourceまた、プロパティをモデルに明示的に設定してみました。バインディングはどのように設定する必要がありますか?

4

3 に答える 3

3

ここでの問題は、プロパティが依存関係Valueプロパティと完全に無関係であるということです。ValueProperty

依存関係プロパティのCLRラッパーは、次のようにDependencyObjectのGetValueメソッドとSetValueメソッドを呼び出す必要があります。

public string Value
{
    get { return (string)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

プロパティの変更に関する通知を受け取るには、PropertyChangedCallbackPropertyMetadataに登録する必要があります。

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register(
        "Value", typeof(string), typeof(FooView),
        new PropertyMetadata(ValuePropertyChanged));

private static ValuePropertyChanged(DependencyObject obj,
    DependencyPropertyChangedEventArgs e)
{
    // obj is your FooView instance
    // get new property value from e.NewValue
}

詳細については、カスタム依存関係のプロパティを参照してください。

于 2012-08-16T12:42:43.027 に答える
1

私はあなたがSourceプロパティを逃していると思います:

Binding myBinding = new Binding("Value");
myBinding.Source = TheSourceOfTheProprty;
myBinding.Mode = BindingMode.OneWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
myBinding.IsAsync = false;

BindingOperations.SetBinding(YourControl, YourControl.Property, myBinding);

クレメンスが説明したように修正した後Dependency Property、バインディングを設定するだけで、準備が整います。

したがって、とのバインディングは次のようになります。

FooViewModel model = new FooViewModel();

FooView view = new FooView(model);
view.DataContext = model;
view.Show();
model.Value = "ABC";


public FooView(FooViewModel model)
{
    Binding myBinding = new Binding("Value");
    myBinding.Source = model;
    myBinding.Mode = BindingMode.OneWay;
    myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

    BindingOperations.SetBinding(this, this.Value, myBinding);
}
于 2012-08-16T12:26:56.310 に答える
0

私が間違っていなければ、コードビハインドからfooviewウィンドウのtitleプロパティを設定しようとしています。その場合は、fooviewコンストラクターの下でxeバインディング行を使用できます

 Binding valueBinding = new Binding("Value");
valueBinding.Mode = BindingMode.TwoWay;
SetBinding(TitleProperty, valueBinding);|
于 2012-08-16T12:58:42.287 に答える