1

如果 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 或图像元素。我猜你不能绑定到 DataTemplate 或者我做错了什么?我能以某种不同的方式做同样的事情吗?

4

1 回答 1

1

您确实无法在此处绑定到您的 dataTemplate,因为它超出了 RowStyle 的范围。

我会以另一种方式做到这一点:

  1. 如我所见,您应该能够在 ItemViewModel 中确定 TextBox 和图像是否同时折叠
  2. 在您的 ItemViewModel 中添加一个属性(例如“VisibilityProperty”),并在 TextBox 和 Image 都折叠时将其设置为“Collapsed”。
  3. 通过 RowStyle 将 DataGridRow 的 VisibilityProperty 绑定到 ItemViewModel 的此属性。

这应该这样做

编辑: 如果你不能改变你的 itemViewModel,你有另一个选择(虽然很丑):

将 Row 的 Visibility 绑定到 Item 本身,并使用转换器查找子项并查看它们是否在运行时折叠。

类似的东西:

<Style TargetType="{x:Type DataGridRow}" x:Key="DataGridRowStyle">
    <Setter Property="Visibility" Value="{Binding Converter=MyRowViewModelToVisibilityconverter}" />
</Style>

并且您的转换器代码显然拥有该项目,因此只需查找 TextBox 的 ViewModel 和 Image 的 Viewmodel 并查看它们是否会折叠 Image 和 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();
    }
}
于 2012-07-20T07:17:58.300 回答