Условное связывание в столбце datagrid - PullRequest
0 голосов
/ 03 июля 2018

У меня есть DataGrid, который itemsSource является ObservableCollection<MyType>. Этот тип имеет следующие свойства:

long ID;
long IDCategory;
long? IDState01;
long? IDEstate02;
long? IDEste03;

У меня есть 3 категории, если это категория 1, IDState01 не является нулевым, а остальные состояния являются нулевыми. Если категория равна 2, IDState02 не является нулевым, а остальные равны нулю и сын включен.

В моем DataGrid есть столбец состояния, значение которого зависит от категории. Поэтому я хотел бы привязать к правильному свойству в зависимости от категории, поэтому, если категория равна 1, это будет привязывать свойство state01, если категория равно 3, это будет привязывать свойство state02 и т. Д.

Я думаю, что мой DataGrid будет примерно таким:

<DataGrid HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch">
    <DataGrid.Columns>
        <DataGridTextColumn Header="State">
            <!--Something here, perhaps a datatrigger.-->
        </DateGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

Спасибо.

РЕДАКТИРОВАТЬ: Я хотел бы сделать это в XAML, если это возможно, вместо использования конвертера.

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Я думаю, что вам потребуется собственный DataTemplate для каждой категории и DataTemplateSelector для назначения DataTemplate на основе типа категории.

0 голосов
/ 03 июля 2018

Я бы хотел сделать это в XAML, если это возможно ...

Вы можете использовать DataGridTemplateColumn:

<DataGridTemplateColumn Header="State">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IDCategory}" Value="1">
                                <Setter Property="Text" Value="{Binding IDState01}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IDCategory}" Value="2">
                                <Setter Property="Text" Value="{Binding IDEstate02}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IDCategory}" Value="3">
                                <Setter Property="Text" Value="{Binding IDEste03}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox>
                <TextBox.Style>
                    <Style TargetType="TextBox">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IDCategory}" Value="1">
                                <Setter Property="Text" Value="{Binding IDState01}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IDCategory}" Value="2">
                                <Setter Property="Text" Value="{Binding IDEstate02}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IDCategory}" Value="3">
                                <Setter Property="Text" Value="{Binding IDEste03}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
0 голосов
/ 03 июля 2018

введите свойство, которое будет получать / устанавливать правильное состояние в зависимости от категории:

public long? State
{
    get 
    { 
        if (IDCategory == 1) return IDState01; 
        if (IDCategory == 2) return IDState02; 
        return null;
    }
    set 
    { 
        if (IDCategory == 1) IDState01 = value; 
        else if (IDCategory == 2) IDState02 = value; 
    }
}

в столбце привязки DataGird к новому свойству:

<DataGridTextColumn Header="State" Binding="{Binding State}"/>
...