如果DataGrids通过转换器,我需要将DataGrid的RowStyle属性绑定到Visibility。问题是孩子们存在于DataTemplate中。我下面的代码是我现在正在做的简化版本,所以它可能没那么重要。但无论如何:
<DataGrid Name="dataGrid"
ItemsSource="{Binding Path=ListOfData}"
RowStyle="{StaticResource DataGridRowStyle}"
>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Name="textBlock" Source={Binding Path=Title}
<Image Name="image" Source="{Binding Path=Image}"/>
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
问题是,TextBlock和Image可以单独折叠。如果两者都折叠,我需要DataGridRow折叠或隐藏,这样你就不会在网格中看到它。我的计划是定义一个名为'DataGridRowStyle'的RowStyle。样式将由TextBlock和Images的Visibility属性触发,并将RowStyle的Visibility设置为折叠。
<Style TargetType="{x:Type DataGridRow}" x:Key="DataGridRowStyle">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Value="True">
<Condition.Binding>
<MultiBinding Converter="{StaticResource VisibilityConverter}">
<Binding ElementName="textBlock" Path="Visibility" />
<Binding ElementName="image" Path="Visibility" />
</MultiBinding>
</Condition.Binding>
</Condition>
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Collapsed"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
不幸的是,我在运行时收到警告,其中System.Data无法伪造我的textBlock或image元素。我想你不能绑定到DataTemplate或我做错了什么?我可以以某种方式做同样的事情吗?
答案 0 :(得分:1)
你确实无法在这里绑定到你的dataTemplate,因为它超出了RowStyle的范围。
我会以其他方式这样做:
这应该做到
修改强> 如果你不能改变你的itemViewModel,你还有另一个选择(虽然很难看):
将Row的Visibility绑定到Item本身,并使用转换器查找items子项,并查看它们是否在运行时折叠。
沿着这些方向:
<Style TargetType="{x:Type DataGridRow}" x:Key="DataGridRowStyle">
<Setter Property="Visibility" Value="{Binding Converter=MyRowViewModelToVisibilityconverter}" />
</Style>
你的转换器代码显然你有这个项目,所以只需查看TextBox的ViewModel和Image的Viewmodel,看看它们是否会折叠Image&amp; TextBox,然后返回可见性:
public class MyRowViewModelToVisibilityconverter: MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var item = value as ItemViewModel;
bool isImageCollapsed = false, isTextBoxCollapsed = false;
// Look into your ItemViewModel for the properties inducing a Visibility=Collapsed on the Image and the TextBox
return (isImageCollapsed && isTextBoxCollapsed) ? Visibility.Collapsed : Visbility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new MyRowViewModelToVisibilityconverter();
}
}