我遇到了今天的独特情况,我需要在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
属性传递给转换器上的静态方法或其他东西。有什么想法吗?
答案 0 :(得分:1)
首先,您不能直接使用布尔值进行可见性。您需要使用BooleanToVisibilityConverter。
其次,关于 OR ,您有不同的选择:
在IsEditableOrAdmin
中创建一个只读属性Whatever
,返回您想要的值。缺点:您的Whatever
需要对TheModel
的反向引用。
使用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>
使用更强大的绑定框架,例如PyBinding。