2011-12-27 53 views
1

我目前有一個簡單的類來存放各種形式的數據,我將其稱爲MyData用於此問題。該類通常在xaml的容器資源部分下創建。它目前有一個名爲ShowDependencyProperty,表示它的數據是否應該在UI中可見。此資源的常見用途是模擬TextBlock以顯示數據並使用轉換器將Show綁定到其VisibilityShow本身的值通常來自另一個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> 

上面的情況顯然是我目前正在處理的簡化版本,但它目前完美地工作。但是,我需要允許多個綁定來影響數據的可見性。爲了澄清,當且僅當所有的值都是真的,那麼應該顯示數據。所以,從上面的邁德特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>其中SomeBoolEncapsulation執行INotifyPropertyChanged。當SomeBoolEncapsulation的內部布爾的值改變時,只會提高屬性更改。當您從ObservableCollection附件/分離處理程序收到CollectionChanged事件到收集項目的PropertyChanged時,以這種方式知道bool值何時更改。然後,當綁定到viewmodel的布爾屬性使用轉換器,將虛擬機的布爾封裝到SomeBoolEncapsulation。希望這可以幫助。

+0

我認爲它也應該工作。我想我做錯了什麼。你們能否看看這個[示例應用程序](http://dl.dropbox.com/u/26625851/SampleApp.zip)並讓我知道我在做什麼錯了?它應該根據目標值的狀態隱藏和顯示文本塊。 – 2011-12-30 20:02:13

+0

當你使用'Source = {StaticResource MyModel}'的時候,你使用'ElementName = MyModel'綁定目標值。我已經在你發佈的應用中檢查過它,它的功能就像一個魅力。 – dmusial 2011-12-30 23:46:08

+0

太棒了!感謝您的快速回復。 'ElementName'和'Source'有什麼區別? 'ElementName'通常有效,爲什麼它在這種情況下不起作用? – 2011-12-31 00:02:22