Datagrid: цвет фона + отключение выделения в зависимости от значения ячейки - использование триггера

Есть много вопросов о данных WPF на SO, но я все еще должен задать свой, потому что я просто не могу получить то, что я хочу от них... так что не сердитесь на меня и постарайтесь помочь мне, отвечая довольно пожалуйста:].

подсказка: главный вопрос: почему мой триггер не работает?: |

  1. Есть ли свойство datagrid, которое отключает выбор ячейки без значения? Я думаю, я знал, что было что-то подобное, но я не могу найти это сейчас. Если бы не было такого, как бы ты решил это? Я думал о событии на selectedCellsChanged или что-то в этом роде. Но я не уверен, как это решить.

  2. Как я могу установить фоновое свойство ячейки в зависимости от значения внутри? Искал какое-либо свойство text/content/value для DatagridCell ( http://msdn.microsoft.com/en-us/library/system.windows.controls.datagridcell.aspx), но у меня ничего не получалось... Я знаю там это какой-то конвертер значений, но я думал о решении этого с помощью триггеров.

Некоторая информация: я установил SelectionMode="Extended" + SelectionUnit="Cell",

Я попытался установить фон с помощью триггера, но он не работал:

<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <Style.Triggers>
            <Trigger Property="HasContent"  Value="False">
                <Setter Property="Background" Value="DarkGray"/>
            </Trigger>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="Red"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

Недвижимость IsSelected работает нормально, но нет контента. Это только я думаю (неправильно), что "" или null нет контента? Также попробовал <Trigger Property="Content" Value=""> а также <Trigger Property="Content" Value="null">Но эти вещи просто не хотят работать на меня. Что со мной не так???

Редактировать: я нашел это Q/A - Как я могу изменить цвет фона ячейки с помощью WPF Toolkit Datagrid, так что я думаю, что я буду работать со вторым Q с этим, но все же я не вижу, что не так с моим триггером... Также, если мой триггер сработал, я мог бы установить HasContent="False" как нельзя выбрать, если есть что-то подобное. Но мне просто нужно, чтобы мой триггер работал: D

Edit2: когда я установил <Trigger Property="HasContent" Value="True"> это работает для всех моих ячеек.. Так что я предполагаю, что принимает значение null/"". Это оставляет меня в вопросе:

Как мне решить эту проблему, если я хочу специальный фон для нулей и отключить их выбор?

Edit3: отключение выделения должно работать так: <Setter Property="Focusable" Value="false"/> благодаря WPF ListView отключить выбор.. который не работает:D:'(

Теперь мне просто нужно выработать триггер null содержание клетки... какие-либо намеки?

2 ответа

Решение

Вот так мне удалось окончательно решить мою проблему с выбором пустых ячеек. Я знаю, что это не лучшее решение, но оно работает для меня:D Благодаря этому Q/A: Как определить значение выбранной ячейки в DataGrid? (WPF) это помогло:).

private void mydatagrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
        {
            foreach (var item in e.AddedCells)
            {
                var col = item.Column as DataGridColumn;
                var fc = col.GetCellContent(item.Item);

                if (fc is TextBlock)
                {
                    if (((fc as TextBlock).Text == (""))||((fc as TextBlock).Text == null))
                    {
                        mydatagrid.SelectedCells.Remove(item);
                        fc.Focusable = false; // not sure if neccesarry/working after the previous line
                    }
                }
            }
        }

Часть о цвете фона решается здесь: Как установить фон ячейки таблицы данных во время события AutoGeneratingColumn в зависимости от его значения?

Если у вас есть какие-либо жалобы / улучшения к моему решению, просто добавьте комментарии:).

Я создаю простой DataGrid и попытаться выяснить, почему HasContent вернись всегда true, я проверяю Content собственность и имеет TextBlock в этом. Так что, вероятно, это причина, почему это всегда так.

Для решения этой проблемы вы можете изменить свой Trigger использовать конвертер:

<DataTrigger Binding="{Binding DataContext, RelativeSource={RelativeSource Self}, Converter={StaticResource CellConverter}}"  Value="False" >
     <Setter Property="Background" Value="Green"/>
</DataTrigger>

А в конвертере проверь соответствующее свойство, если ноль. Чтобы узнать, какой конвертер свойств следует проверить, вы можете использовать ConverterParameter,

Это не элегантное решение... но оно работает;)

Другие вопросы по тегам