0

どこでも使用できる値入力コントロールを書いています。コントロール自体には、通常どおり DataContext に設定されたビュー モデルがあります。しかし、次のような親コントロールでコントロールを使用すると:

<UserControl x:Class="X.Y.Z.ParentControl">
    ...
    <local:ValueInput Value="{Binding Path=MyValue}" />
    ...
</UserControl>

MyValueプロパティをコントロールにバインドしようとしていますが、WPF から、コントロール自体のビュー モデルであるクラス内にプロパティが見つからないことがわかります。WPF が child の値を探しているのはなぜですか?ParentControlDataContextValueInputMyValueValueInputViewModelValueInputDataContext

次のように使用できるコントロールを書きたいだけです。

<telerik:RadNumericUpDown Value="{Binding Path=NumberValue}" />

プロパティは、コントロールではなくNumberValue、親の で定義されています。DataContextこのパターンはテレリクス コントロールでは機能しますが、私のコントロールでは機能しません。

私は何をすべきか?

4

2 に答える 2

1

どの FrameworkElement でも、DataContext は 1 つしか存在できません。

UserControl に独自の DataContext がある場合、親の DataContext を使用できません。

ただし、RelativeSource を使用して、親まで歩いてその DataContext を取得できます (親の DataContext を参照する必要があるたびに)。

Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.NumberValue}"

この例が機能するには、親 (任意のレベルのルート) が Window である必要があります。ユーザーコントロールの場合、

Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type UserControl}}, Path=DataContext.NumberValue}"

コードは、fiqが提供するこのリンクからのものです。

于 2012-05-11T03:58:52.307 に答える
0

私の友人はDataContext、DataContext は簡単にオーバーライドされるため、スタンドアロン コントロールのビュー モデルとして使用しないように言いましたViewModel。プロパティを定義し、XAML でバインドすると問題が解決する可能性があります。次に例を示します。

モデルクラスを表示:

public class MyValueInputViewModel
{
    public string MyText { get; set; }
}

コードビハインド:

public partial class MyValueInput : UserControl
{
    public MyValueInput()
    {
        InitializeComponent();

        this.ViewModel = new MyValueInputViewModel
        {
            MyText = "Default Text"
        };
    }

    public static readonly DependencyProperty ViewModelProperty =
        DependencyProperty.Register("ViewModel", typeof(MyValueInputViewModel), typeof(MyValueInput));

    public MyValueInputViewModel ViewModel
    {
        get
        {
            return (MyValueInputViewModel)this.GetValue(ViewModelProperty);
        }
        private set
        {
            this.SetValue(ViewModelProperty, value);
        }
    }

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

    private static void OnValuePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs args)
    {
        var input = (MyValueInput)o;
        input.ViewModel.MyText = input.Value;
    }

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

XAML:

<UserControl x:Class="..." x:Name="Self" ...>
    <Grid>
        <TextBox Text="{Binding ViewModel.MyText, ElementName=Self, UpdateSourceTrigger=PropertyChanged}" />
    </Grid>
</UserControl>
于 2012-05-11T06:56:20.227 に答える