基于绑定对象和模型属性的可见绑定

时间:2010-09-22 20:15:04

标签: c# .net wpf xaml binding

我遇到了今天的独特情况,我需要在Visible中绑定按钮的DataGridRow属性,以基于绑定对象的属性和支持它的模型的属性

XAML:

<t:DataGrid ItemsSource="{Binding Items}">
    <t:DataGrid.Columns>
        <t:DataGridTemplateColumn>
            <t:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Visibility="IsEditable OR IsAdmin"/>
                </DataTemplate>
            </t:DataGridTemplateColumn.CellTemplate>
        </t:DataGridTemplateColumn>
    </t:DataGrid.Columns>
</t:DataGrid>

型号:

class TheModel
{
    public ObservableCollection<Whatever> Items { get; set; }
    public bool IsAdmin { get; set; }
}

类别:

class Whatever
{
    public bool IsEditable { get; set; }
}

这让我很难过。我能想到的唯一概念可能是以某种方式将绑定对象和整个模型或仅IsAdmin属性传递给转换器上的静态方法或其他东西。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先,您不能直接使用布尔值进行可见性。您需要使用BooleanToVisibilityConverter

其次,关于 OR ,您有不同的选择:

  1. IsEditableOrAdmin中创建一个只读属性Whatever,返回您想要的值。缺点:您的Whatever需要对TheModel的反向引用。

  2. 使用MultiBinding并编写IMultiValueConverter。然后,在MultiBinding中传递两个值。由于此时TheModel不再位于DataContext范围内,因此您可以使用Binding的ElementName属性来引用仍可访问TheModel的UI元素。

    示例(未经测试):

    <SomeElementOutsideYourDataGrid Tag="{Binding TheModel}" />
    ...
        <Button>
            <Button.Visibility>
                <MultiBinding Converter="{StaticResource yourMultiValueConverter}">
                    <Binding Path="IsEditable" />
                    <Binding ElementName="SomeElementOutsideYourDataGrid" Path="Tag.IsAdmin"/>
                </MultiBinding>
            </Button.Visibility>
        </Button>
    
  3. 使用更强大的绑定框架,例如PyBinding