0

WPF には、単一のバインドされたデータに対して何もしない、何も表示しないストレージ リポジトリとして機能する「コントロール」がありますか? 基本的に、"Tag" DependencyProperty のみを公開する非表示のコントロールです。

「頻繁に使用する」データ バインディングの一部を 1 つの場所に統合する方法として、このようなコントロールを使用したいと考えています。後で ViewModel プロパティの名前を変更した場合、バインディングを 1 か所で更新するだけで済みます。私の「タグ」コントロール。

元:

<!-- Does this type of control exist? -->
<StorageControl x:Name="someData" Tag="{Binding MyProperty}" />
<StorageControl x:Name="moreData" Tag="{Binding MyOtherProperty}" />

<!-- further down the XAML file... -->
<TextBlock Text="{Binding Tag, ElementName=someData}">
    <Image.Style> 
        <!-- Style makes reference to "someData" and "moreData," -->
        <!-- with data triggers effecting the appearance. -->
    </Image.Style>
</TextBlock>
<Image>
    <Image.Style> 
        <!-- Style makes reference to "someData" and "moreData," -->
        <!-- with data triggers effecting the appearance. -->
    </Image.Style>
</Image>

このようなコントロールを使用すると、別の方法では複雑で深くネストされた ViewModel 構造を単一のビュー内で「平坦化」することもできます。また、ユーザー インターフェイスのモックアップをスタブ化するときにプレースホルダーとして使用することもできますが、まだ ViewModel を生成していません。

もう 1 つの理想的な使用シナリオは、使い捨ての「IValueConverter」クラスを作成する代わりに使用することです。例として、結果の「不透明度」を取得するために、IValueConverter を介してデータ バインドされた値をフリッターしようとするのではなく、DataTriggers を使用して正しい値を提示するように StorageControl を「スタイル」することができます。

<StorageControl x:Name="opacityHost">
    <StorageControl.Style>
        <Style TargetType="StorageControl">
            <Setter Property="Tag" Value="1.0" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding MyProperty}">
                    <!-- This opacity trigger can now be used -->
                    <!-- by many other controls, without overriding their style -->
                    <Setter Property="Tag" Value="0.5" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StorageControl.Style>
</StorageControl>

自分で作成できることはわかっていますが、これはすでに存在している可能性がある十分に汎用的なコントロールのようです。

このシナリオでFrameworkElementを使用しますか?

4

1 に答える 1

0

私が覚えている限り、そのようなコントロールは存在しませんが、簡単に記述できます。文字通り、次のもので構成されます。

class MyDataHolder : Control
{
    // now add here one DependencyProperty that DONT have "AffectsXYZ" flags
    // or many DepProps if you want to 'gather' more things in one place
}

実際には、いつでも設定できVisible=Collapsed、Bindings が引き続き機能することを考えると、単純なContentPresenter/ ContentControl、折りたたまれて、それらのContentプロパティに "Tag" があるものを使用することもできます。本当に急いでいるとき、私はそのトリックを数回使用しました。

ただし、これは方法ではないことに注意してください。いくつかのことは簡単になりますが、最終的には、多くの問題のために誰もが避けようとしていたいくつかのコースで教えられた単純な WinForms の方法に進むことになります。

「Control+DP」の方法を注意深く調べると、より良い「見た目のないコントロール」を作成するためのいくつかのトリックを学ぶことができます。また、さらに考えてみると、最終的に「DP」と「Control」の部分が取り除かれ、ViewModel が「発見」され、UI の動作をテストできるようになります。

ルックレス コントロール + スタイルを使用すると、Biindings を一度記述して、そのスタイルを再利用できます。

「コンポジット スタイル」(Web で検索! キーワード: コンポジット、マージ、マルチなど) を使用すると、同じコントロールに複数のスタイルを適用できますが、もちろんいくつかの制限があります。

最後に、これらすべてに追加する場合はAttachedDependencyProperty、XAML によって任意のコードを挿入できるようにする「Behaviors」のアイデアについて検索します。これにより、ビジュアル ツリーをウォークスルーし、カスタム スタイル、バインディングなどを自動的に適用する比較的単純なスキャナー/オブザーバーを作成できます。

ただし、たまたま手に入るわけではありません - これらのいくつかは、より複雑なコードになってしまいます。同じコントロールに適用された 2 つまたは 5 つのビヘイビア間の衝突をデバッグすることは、悩ましいことです。

編集:

私が見つけた「複合スタイル」へのメモ/リンク:

于 2014-06-02T15:14:17.280 に答える