5

Binding インスタンスが DataTemplate 内で共有される理由の背後にある解決策や合理性を探しています。これは最終的に、DataTemplate 内では、生成された各コントロールの DependencyProperty で Binding の新しいインスタンスを強制する方法がないように見えるという事実に帰着します。これはおそらく、そのコントロールのインスタンスに固有のものを表す ValidationRules がある場合を除いて、すべての場合において公正で適切な仮定です。

詳しく説明するために (コードを提供することはできますが、必要だとは思いません)、IsEnabled で DependencyPropertyDescriptor を使用して、TextBox.Text Binding、DatePicker.Text Binding、または ComboBox.SelectedValue Binding に属する 1 つ以上の ValidationRules を更新します。など。コントロールが有効になっていない場合、検証は異なるか、望ましくないという考えです。

このため、ValidationRule の IsEnabled の状態は個々のコントロールに固有であり、ValidationRule Collection は Binding の一部であり、Binding インスタンスが共有されているため、最終的にそのバインディングを共有する各コントロールは、以前の IsEnabled 値を更新/上書きします。これは、以前に生成されたコントロールの IsEnabled 値によって適用されました。

IsEnabled は、バインディングが適用されるコントロールの状態を表す ValidationRule (別のカスタム IsRequired DependencyProperty) の少なくとも 2 つのプロパティの 1 つにすぎません。DataTemplate の外部で作業する場合 (IE: Binding インスタンスは共有されません)、これは非常にうまく機能し、コントロールの状態に基づいて検証ロジックを無視/変更します。私は代替案に閉ざされているわけではありませんが、これは (この問題は別として) 非常に柔軟で動的なオプションであり、Binding インスタンス ValidationRule とルールの制御変更状態を楽に進化させることができると感じています。これにより、ValidationRule'震える

どんな考えでも大歓迎です!

4

1 に答える 1

1

DataTemplate 定義でx:Shared 属性を使用することをお勧めします。

<DataTemplate x:Key="DataTemplateKey" DataType="{x:Type YourType}" x:Shared="False">
    ...
</DataTemplate>

これを使用するため、WPF はリクエストごとに新しい DataTemplate インスタンスを作成します。

于 2014-01-24T13:25:04.360 に答える