【问题标题】:Silverlight - Determine visibility using multiple bindingsSilverlight - 使用多个绑定确定可见性
【发布时间】:2011-12-27 04:13:45
【问题描述】:

我目前有一个简单的类来保存各种形式的数据,我将它称为MyData 就这个问题的目的。该类通常在容器的资源部分下的 xaml 中创建。它目前有一个名为Show 的DependencyProperty,表示它的数据是否应该在UI 中可见。此资源的常见用途是模板化TextBlock 以显示数据并使用转换器将Show 绑定到其Visibility。 Show 本身的值通常来自另一个 DependencyProperty(通常在用于 MVVM 实现的 ViewModel 中)。我有一个如下所示的示例。

<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>

我的第一个想法是让Show 成为ObservableCollection&lt;bool&gt;,但它不会跟踪其项目的值是否发生变化,只有当项目本身发生变化时。例如,当“ModelValue1”从 true 变为 false 时,不会引发集合的 CollectionChanged 事件。所以,我需要一种方法来利用多个绑定来确定某些东西的可见性。

我意识到这是一个相当长的问题,但它有点复杂,所以我试着尽可能详细。请随时要求我澄清任何事情。

【问题讨论】:

    标签: c# data-binding binding silverlight-4.0


    【解决方案1】:

    我认为您对ObservableCollection&lt;bool&gt; 的想法实际上可能工作得很好,但是有一个小的修改。我会创建类似ObservableCollection&lt;SomeBoolEncapsulation&gt; 的东西,其中SomeBoolEncapsulation 实现INotifyPropertyChanged。当SomeBoolEncapsulation 的内部布尔值发生变化时,只是 raise 属性发生了变化。当您从 ObservableCollection 附加/分离处理程序接收到 CollectionChanged 事件到集合项的 PropertyChanged 时,这样您就知道 bool 值何时发生变化。然后,当绑定到 viewmodel 的 bool 属性时,使用转换器将来自 VM 的 bool 封装到 SomeBoolEncapsulation 中。希望这会有所帮助。

    【讨论】:

    • 我认为它也应该可以工作。我想我做错了什么。你们中的某个人可以看看这个sample application 并让我知道我做错了什么吗?它应该根据目标值的状态隐藏和显示文本块。
    • 当绑定到目标值时,你使用ElementName=MyModel,而你应该使用Source={StaticResource MyModel}。我已经在你发布的应用程序上检查了这一点,它就像一个魅力。
    • 太棒了!感谢您的快速回复。 ElementName 和 Source 有什么区别? ElementName 通常有效,为什么在这种情况下无效?
    • ElementName 用于绑定到 UI 元素(Visual Tree 的元素)。 Source 用于指向任何对象,尽管它通常用于 Window/Page/Control 资源。您已经创建了 VM 以及其他项目作为用户控件的资源,因此它们不是可视树的元素(只是放置在控件资源字典中的普通实例)。
    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 2010-11-14
    • 2012-06-12
    • 2012-01-16
    • 1970-01-01
    • 2013-12-13
    • 2012-06-10
    • 2011-04-03
    相关资源
    最近更新 更多