Как связать свойство родителей с табличкой дочерних элементов
Мне нужно связать свойство 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.
Я бы сделал это по-другому:
- На мой взгляд, вы должны быть в состоянии определить в своей ItemViewModel, свернуты ли TextBox и изображение одновременно
- Добавьте свойство в ItemViewModel (например, "VisibilityProperty") и установите для него значение "Свернутый", когда они и TextBox, и Image свернуты.
- Свяжите 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();
}
}