4

この状況を想定します:
DependencyProperty "SuperValue" を使用して新しいコントロール ("MyControl") を作成しました。
ここで、XAML で「SuperValue」を「TestValue」に設定します。

<local:MyControl SuperValue="TestValue" />

このコントロールには ViewModel (DataContext) があります。
DependencyProperty の値 (この例では "TestValue") を ViewModel のプロパティに渡したいと思います。

これどうやってするの?

たとえば、ユーザーが国の名前を入力すると、コントロールは現在そこにある時間を彼に与えます。

問題は、計算結果をどのように提供できるかです。これが ViewModel のパブリック プロパティ "Results" であるとします。ViewModelのデータの一部を「外部に」提供する「TextBox.Text」「ListView.SelectedItem」のようなプロパティを作成したい。

たとえば、TextBox と Text プロパティ:

<TextBox Text={Binding GiveMeTextValue} />

この場合、DP "Text" は、現在入力されたテキストを格納している ViewModel プロパティの外部に提供します。

私は自分のコントロールを同じように使いたいと思っています。

4

5 に答える 5

3

あなたの質問が正しいかどうかわかりません: XAML でバインドされていない静的な値をコントロールの DependencyProperty に設定し、コントロールの DataContext のプロパティをこの静的な値に設定しますか? これを行う必要がある場合、コンセプトに何か問題があります。ViewModel の対応するフィールドにこの値を提供し、コントロールの DP をこのフィールドにバインドしてみませんか?

ただし、あなたができることは、あなたが望むものを得ることができます:

DP を登録するときにPropertyChangedCallbackを定義します。

// Dependency Property
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("Test", typeof(string),
typeof(MyControl), new FrameworkPropertyMetadata("123", new PropertyChangedCallback(OnTestChanged)));

OnTestChanged メソッドで、DataContext を ViewModel の型にキャストし、ViewModel の対応する値を新しい値に設定します。

private static void OnTestChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            MyControl c = d as MyControl;
            ViewModelType vm = c.DataContext as ViewModelType;
            vm.Property = e.New;
            Console.WriteLine(e.NewValue);
        }

それはあなたが求めているものですか?

于 2012-11-04T21:44:26.237 に答える
1

設定時に、の値を設定するMyControlというプロパティを追加できます。次に、次のようなXAMLを記述します。InitialSuperValueSuperValue

<local:MyControl InitialSuperValue="TestValue" SuperValue="{Binding SuperValueInViewModel, Mode=OneWayToSource}" />
于 2012-11-06T17:38:06.390 に答える
1

MVVM 設計パラダイムを使用しているため、すべてのデータは ViewModel に対して相対的である必要があります。したがって、DP は VM プロパティのバインディングを介して設定する必要があります。

テスト データが Blend/VS デザイナーで使用される場合は、それと Debug/Release を比較して確認できます。次に、テストの確認に基づいて、プロパティに何らかの割り当てを行います。

于 2012-11-06T15:47:08.397 に答える
1

プロパティのMyDependencyPropertyfrom を設定するのはどうですか。setterSomethingValueInDataContext

編集

DependencyProperty宣言ではなく、コントロールが使用される場所にコントロールを設定できます。これは機能します(ローカルはコントロールが存在する名前空間です)-

<Grid>
   <local:MyOwnControl MyDependencyProperty="{Binding Test}"/>
</Grid>

このようにxamlでインスタンスを作成するときにWidth設定できるのと同じです-TextBox

<TextBox Width="{Binding PropertyName}"/>
于 2012-10-24T15:13:58.003 に答える
1

xaml のルートは であり、 ではUserControlないこと MyOwnControlに注意してください。UserControl はMyOwnControlの基本クラスです。あなたのプロパティは基本クラスで定義されていません。MyDependencyPropertyこれが、 のルート要素内から参照できない理由ですUserControl

あなたの例を使用すると、バインディングを切り替えて、目的の効果を得ることができます。

<UserControl 
    x:Class="namespace.MyOwnControl"
    x:Name="root">
    <UserControl.DataContext>
         <local:ControlViewModel  
             Test={Binding MyDependencyProperty, ElementName=root}" />
    </UserControl.DataContext>
</UserControl>
于 2012-10-30T16:37:11.563 に答える