Как связать свойство родителей с табличкой дочерних элементов

Мне нужно связать свойство RowStyle моей DataGrid с видимостью, если DataGrids потомков через конвертер. Дело в том, что дети существуют в 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 свернулся или скрылся, чтобы вы не видели его в сетке. Мой план состоял в том, чтобы определить RowStyle с именем "DataGridRowStyle". Стиль будет вызван свойствами TextBlock и Images Visibility и установит видимость RowStyle как свернутую.

  <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 или что я делаю неправильно? Можно ли как-нибудь сделать то же самое по-другому?

1 ответ

Решение

Вы действительно не можете привязать свой dataTemplate здесь, так как это выходит за рамки RowStyle.

Я бы сделал это по-другому:

  1. На мой взгляд, вы должны быть в состоянии определить в своей ItemViewModel, свернуты ли TextBox и изображение одновременно
  2. Добавьте свойство в ItemViewModel (например, "VisibilityProperty") и установите для него значение "Свернутый", когда они и TextBox, и Image свернуты.
  3. Свяжите VisibilityProperty вашего DataGridRow с этим свойством ItemViewModel через RowStyle.

это должно сделать это

изменить: если вы не можете изменить свою itemViewModel, у вас есть другой вариант (хотя и довольно уродливый):

привязать видимость строки к самому элементу и использовать конвертер для поиска дочерних элементов и проверки их свертывания во время выполнения.

что-то в этом роде:

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

и код вашего конвертера у вас есть элемент, очевидно, так что просто посмотрите на ViewModel TextBox и 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();
    }
}
Другие вопросы по тегам