Скрыть строки в DataGrid, где выполняются несколько условий, в контексте MVVM - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь скрыть все строки в DataGrid, где выполняются два условия:

  • ViewModel имеет bool ShowSelectedCat { get; }, установленный в true
  • Cat.equals(ViewModel.SelectedCat), где Cat - строка, специфичная для строки

                        <DataGridTemplateColumn Header="Category">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate DataType="{x:Type ui:LocalImage}">
                                    <TextBlock Text="{Binding Cat}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
    

Я также хотел бы соблюдать шаблон MVVM. ShowSelectedCat изменяется на ICommand и вызывает PropertyChangedEventHandler.

Я не мог понять, как использовать DataGrid.RowStyle для этих множественных условий.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Первое условие легко:

<Condition Binding="{Binding DataContex.ShowSelectedCat, RelativeSource={RelativeSource AncestorType=DataGrid}}" Value="True" />

Второе не может быть выражено в XAML. Вы можете использовать конвертер и <MultiBinding>, который связывается с ViewModel.SelectedCat и Cat и сравнить их:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding DataContext.ShowSelectedCat, RelativeSource={RelativeSource AncestorType=DataGrid}}" Value="True" />
        <Condition Value="True">
            <Condition.Binding>
                <MultiBinding>
                    <MultiBinding.Converter>
                        <local:MultiConverter />
                    </MultiBinding.Converter>
                    <Binding Path="DataContext.SelectedCat" RelativeSource="{RelativeSource AncestorType=DataGrid}" />
                    <Binding Path="Cat" />
                </MultiBinding>
            </Condition.Binding>
        </Condition>
    </MultiDataTrigger.Conditions>
    <Setter ... />
</MultiDataTrigger>

public class MultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) =>
        values[0]?.Equals(values[1]);

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) =>
        throw new NotSupportedException();
}
0 голосов
/ 10 октября 2019
                            <DataGrid.RowStyle>
                                <Style TargetType="DataGridRow">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding _prop1}" Value="value1">
                                            <Setter Property="Visibility" Value="Collapsed"></Setter>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding _prop2}" Value="value2">
                                            <Setter Property="Visibility" Value="Collapsed"></Setter>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </DataGrid.RowStyle>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...