2011-12-27 8 views
1

現在、さまざまな形式のデータを保持する単純なクラスがありますが、この質問の目的でMyDataと呼びます。クラスは、通常、コンテナのリソースセクションの下にxamlで作成されます。現在、DependencyPropertyという名前のShowがあり、そのデータをUIで表示する必要があるかどうかを示します。このリソースの一般的な使用方法は、TextBlockをテンプレートとしてデータを表示し、コンバータを使用してVisibilityShowをバインドすることです。 Showの値自体は通常、別のDependencyProperty(通常はMVVM実装のViewModel)に由来します。私は以下の例を持っています。Silverlight - 複数のバインディングを使用して可視性を判断する

<navigation:Page.Resources> 
    <ViewModel x:Name="MyModel"/> 
    <MyData Data="Some Sample Data" Show="{Binding ModelValue, ElementName=MyModel}"/> 
    <DataTemplate> 
     <TextBlock Text={Binding Data} Visibility="{Binding Show, Converter={StaticResource BoolToVisibilityConverter}}"/> 
    </DataTemplate> 
</navigation:Page.Resources> 

上記のシナリオは、明らかに私が現在取り組んでいるものの簡略版ですが、現在は完全に機能しています。しかし、データの可視性に影響を与えるために複数のバインディングを許可する必要があります。明確にするために、すべての値が真である場合にのみ、データが表示されます。だから、上からのMyDataのXAMLは、より次のようになります。

<MyData Data="Some Sample Data"> 
    <MyData.Show> 
     <AnotherClass Value="{Binding ModelValue1, ElementName=MyModel}"/> 
     <AnotherClass Value="{Binding ModelValue2, ElementName=MyModel}"/> 
    </MyData.Show> 
</MyData> 

私が最初に考えたのはShowObservableCollection<bool>を作ることだったが、それはアイテムのみ自ら場合、その項目の値が変更するかどうかを追跡しません。変化する。たとえば、 'ModelValue1'がtrueからfalseに変更されると、コレクションのCollectionChangedイベントは発生しません。だから、私は何かの可視性を判断するために複数のバインディングを利用する方法が必要です。

私はこれがかなり長い質問であることを理解していますが、そのような複雑なものであるため、必要に応じて詳細にしようとしました。私は何かを明確にするように私に依頼してください。

答えて

0

あなたの考えはObservableCollection<bool>で実際にうまくいくかもしれないと思いますが、小さな修正が施されています。私はObservableCollection<SomeBoolEncapsulation>のようなものを作成します。SomeBoolEncapsulationINotifyPropertyChangedを実装しています。 SomeBoolEncapsulationの内のboolの値が単にraiseプロパティを変更したとき。 CollectionChangedイベントをObservableCollectionアタッチ/デタッチハンドラからコレクションアイテムのPropertyChangedに受け取ると、ブール値が変わるときを知ることができます。次に、viewmodelのboolプロパティにバインドするときに、VMからboolをカプセル化してSomeBoolEncapsulationに変換するコンバータを使用します。お役に立てれば。

+0

私はそれも動作するはずだと思った。私は何か間違っていると思う。あなたの誰かがこの[サンプルアプリケーション](http://dl.dropbox.com/u/26625851/SampleApp.zip)を見て、私が間違っていることを教えてもらえますか?ターゲット値の状態に基づいてテキストブロックを非表示にして表示する必要があります。 –

+0

ターゲット値にバインドするときは、代わりに 'Source = {StaticResource MyModel}'を使用するときに 'ElementName = MyModel'を使用します。私はあなたが投稿したアプリでこれをチェックして、それは魅力のように動作します。 – dmusial

+0

恐ろしい!早速のお返事ありがとうございます。 'ElementName'と' Source'の違いは何ですか? 'ElementName'は通常動作しますが、なぜこの場合は動作しませんか? –

関連する問題