1

次のような状況があります。

  1. 内部にグリッドが 1 つだけのユーザー コントロールがあります。
  2. グリッドには最初の列がチェックボックス列としてあり、CustomerModel の IsSelected プロパティにバインドされています。
  3. グリッドの ItemsSource は List< CustomerModel> にバインドされています
  4. ユーザーが CheckBoxes のいずれかをチェックすると、CustomerModel の対応する IsSelected プロパティが更新されます。

クエリ:

  1. 「SelectedCustomerItems」という名前の UserControl に依存関係プロパティを追加し、List< CustomerModel> を返すようにしたい (IsSelected = true の場合のみ)

  2. この UserControl は別のウィンドウに配置されます

  3. 依存関係プロパティ「SelectedCustomerItems」は、WindowViewModel 内の「SelectedCustomers」プロパティにバインドされています

しかし、この依存関係プロパティを通じて SelectedCustomer アイテムを取得していません。Get{} でブレークポイントがヒットしない 提案してください....

4

1 に答える 1

6

この方法で DP を実装します。

#region SomeProperty
/// <summary>
/// The <see cref="DependencyProperty"/> for <see cref="SomeProperty"/>.
/// </summary>
public static readonly DependencyProperty SomePropertyProperty =
    DependencyProperty.Register(
        SomePropertyPropertyName,
        typeof(object),
        typeof(SomeType),
        // other types here may be appropriate for your situ
        new FrameworkPropertyMetadata(null, OnSomePropertyPropertyChanged));

/// <summary>
/// Called when the value of <see cref="SomePropertyProperty"/> changes on a given instance of <see cref="SomeType"/>.
/// </summary>
/// <param name="d">The instance on which the property changed.</param>
/// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param>
private static void OnSomePropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    (d as SomeType).OnSomePropertyChanged(e.OldValue as object, e.NewValue as object);
}

/// <summary>
/// Called when <see cref="SomeProperty"/> changes.
/// </summary>
/// <param name="oldValue">The old value</param>
/// <param name="newValue">The new value</param>
private void OnSomePropertyChanged(object oldValue, object newValue)
{

}

/// <summary>
/// The name of the <see cref="SomeProperty"/> <see cref="DependencyProperty"/>.
/// </summary>
public const string SomePropertyPropertyName = "SomeProperty";

/// <summary>
/// 
/// </summary>
public object SomeProperty
{
    get { return (object)GetValue(SomePropertyProperty); }
    set { SetValue(SomePropertyProperty, value); }
}
#endregion  

DependencyProperty は、大量のジャンクが追加された単なるプロパティではなく、WPF バインディング システムへのフックであることを理解する必要があります。これは、DP が優雅に浮かぶ海面下に存在する広大で複雑なシステムです。実際に学習しない限り、予期しない方法で動作します。

私たち全員が DP で経験した最初の啓示を経験しています: バインディングは、プロパティ アクセサー (つまり、getおよびsetメソッド) を介して DependencyProperty 値にアクセスしません。これらのプロパティ アクセサーは、コードからのみ使用できる便利なメソッドです。それらを省略して、システムへの実際のフックであるDependencyObject.GetValue および DependencyObject.SetValueを使用できます (上記の例のゲッター/セッターの実装を参照してください)。

変更通知をリッスンしたい場合は、上記の例で行ったことを行う必要があります。DependencyProperty を登録するときに、変更通知リスナーを追加できます。変更通知を追加するために、継承された DependencyProperties の「メタデータ」をオーバーライドすることもできます (私はこれを常に行っています)。 DataContextDependencyPropertyDescriptor

ただし、何をするにしても、DependencyPropertiesのgetおよびメソッドにコードを追加しないでください。set バインド操作では実行されません。

DependencyProperties の仕組みの詳細については、MSDN のこの優れた概要を読むことを強くお勧めします。

于 2013-03-27T16:43:26.783 に答える