InvalidOperationException в форме WPF при попытке изменить цвет ячейки в DataGrid - PullRequest
0 голосов
/ 10 мая 2018

Я не могу сказать, что я новичок в WPF, потому что это было бы слишком много. Мне просто дали приложение WPF для поддержки ...

Мне нужно изменить определенный цвет ячейки в DataGrid в зависимости от значения. Я думал, что это будет легко, обнаружил, что SO сообщение: Изменение цвета ячейки DataGrid на основе значений .

Вставил, где это принадлежит, что дало мне следующее:

<DataGrid x:Name="DgDevices" ItemsSource="{Binding}" BorderThickness="2,0,2,2" Cursor="Cross">
    <DataGrid.ContextMenu>
        <ContextMenu >
            <MenuItem Header="Załóż Deblokadę" Click="InsertDBL"  />
            <MenuItem Header="Usuń Deblokadę" Click="RemoveDBL"/>
        </ContextMenu>
    </DataGrid.ContextMenu>
    <DataGridTextColumn Binding="{Binding Name}">
        <DataGridTextColumn.ElementStyle>
            <Style TargetType="{x:Type TextBlock}">
                <Style.Triggers>
                    <Trigger Property="Text" Value="1">
                        <Setter Property="Background" Value="Black"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGridTextColumn.ElementStyle>
    </DataGridTextColumn>
</DataGrid>

Теперь, при вызове метода Show в этой форме, он дает мне InvalidOperationException. Я искал объяснение, почему это происходит, но не нашел четкого объяснения.

Кроме того, я знаю, что Binding Name является заполнителем для моей привязки (в <DataGridTextColumn Binding="{Binding Name}">), поэтому я устал помещать туда Binding (вдохновленный ItemsSource="{Binding}" в DataGrid узле), но не решил вопрос.

1 Ответ

0 голосов
/ 10 мая 2018

Теперь вы добавляете DataGridTextColumn прямо в DataGrid, а не в список его столбцов.Добавление элементов напрямую и использование ItemsSource являются взаимоисключающими, поэтому выбрасывается InvalidOperationException (и вы не собирались добавлять столбец как элемент в любом случае).Вместо этого сделайте это следующим образом:

<DataGrid x:Name="DgDevices"
          ItemsSource="{Binding}"
          BorderThickness="2,0,2,2"
          AutoGenerateColumns="False"
          Cursor="Cross">
    <DataGrid.ContextMenu>
        <ContextMenu >
            <MenuItem Header="Załóż Deblokadę" Click="InsertDBL"  />
            <MenuItem Header="Usuń Deblokadę" Click="RemoveDBL"/>
        </ContextMenu>
    </DataGrid.ContextMenu>
    <DataGrid.Columns> <!-- add to columns -->
        <DataGridTextColumn Binding="{Binding Name}">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <Trigger Property="Text"
                                 Value="1">
                            <Setter Property="Background"
                                    Value="Black" />
                            <Setter Property="Foreground"
                                    Value="White" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

Кроме того, поскольку вам нужно установить AutoGenerateColumns на False, потому что в противном случае DataGrid будет автоматически генерировать столбцы из вашего источника данных, в дополнение к столбцам, которые выопределить вручную, и вам это редко требуется.

...