Datagrid: цвет фона + отключение выделения в зависимости от значения ячейки - использование триггера
Есть много вопросов о данных WPF на SO, но я все еще должен задать свой, потому что я просто не могу получить то, что я хочу от них... так что не сердитесь на меня и постарайтесь помочь мне, отвечая довольно пожалуйста:].
подсказка: главный вопрос: почему мой триггер не работает?: |
Есть ли свойство datagrid, которое отключает выбор ячейки без значения? Я думаю, я знал, что было что-то подобное, но я не могу найти это сейчас. Если бы не было такого, как бы ты решил это? Я думал о событии на selectedCellsChanged или что-то в этом роде. Но я не уверен, как это решить.
Как я могу установить фоновое свойство ячейки в зависимости от значения внутри? Искал какое-либо свойство 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
,
Это не элегантное решение... но оно работает;)