DataTemplate с TargetNullValue в ListBox - PullRequest
3 голосов
/ 08 января 2009

У меня есть следующий шаблон данных в списке

<ListBox Grid.Column="1" Grid.Row="2" ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}">
<ListBox.ItemTemplate>
    <DataTemplate>
        <TextBlock OverridesDefaultStyle="True"
               Background="{x:Null}"
               Margin="0"
               Padding="0"
               IsHitTestVisible="True"
               Text="{Binding TargetNullValue=None}"
        />
    </DataTemplate>
</ListBox.ItemTemplate>

Это прекрасно работает, отображая «None» вместо любых значений Null (Nothing) в связанном списке. Проблема в том, что я не могу щелкнуть значения Null, чтобы выбрать их. Выбор с помощью клавиатуры работает отлично, только не с помощью мыши. Что я могу сделать, чтобы значения Null в списке действовали так же, как и любое другое значение?

Редактировать: Я должен также добавить, что я могу изменить фон TextBlock на Красный, и он будет отображаться так же, как и другие, поэтому я не думаю, что это случай, когда нечего нажимать. Я также посмотрел на это с помощью Snoop и не вижу никаких атрибутов в визуальном дереве, которые бы отличались между пустым элементом и обычным элементом.

Редактировать 2: Я должен добавить, что People на самом деле является классом, представляющим таблицу базы данных. Он использует метод ToString для отображения объектов People по умолчанию. Я получаю тот же эффект, если привязываю к нужному полю с помощью параметра «Путь», и мне показалось, что его будет легче читать.

Ответы [ 3 ]

2 голосов
/ 23 февраля 2009

Если вы ищете решение, может быть, вы можете найти то, что вы хотите здесь: Почему я не могу выбрать нулевое значение в ComboBox?

Combobox работает так же, как ListBox.

1 голос
/ 04 января 2012

В блоге ниже представлено хорошее решение с использованием Attached Property, которое хорошо работает для меня

http://danylaporte.blogspot.com/2008/07/wpf-combobox-and-null-values.html

0 голосов
/ 08 января 2009

Вот что я думаю: -

Я предполагаю, что ItemSource - это простая коллекция значений пустых строк (то есть не инкапсулированных в другом классе). При нажатии кнопки мыши на объекте программный код копирует ссылку на объект элемента в коллекции в поле SelectedItem списка.

поэтому, если коллекция: - "Fred", null, "Jane", "Mary" и вы нажимаете мышь на "Fred", тогда ссылка на объект "Fred" копируется в SelectedItem. Если вы нажмете на второй элемент, ссылка на этот объект (ноль) будет скопирована в SelectedItem.

Проблема в том, что значение NULL в SelectedItem фактически означает особый случай, когда ни один элемент не выбран.

Вы не скопируете "None" в SelectedItem, даже если оно указано в вашем атрибуте TargetNullValue. Это просто визуальное представление, когда элемент коллекции содержит значение NULL. Поле списка интересует только ссылки на объекты коллекции, а не то, что отображается в пользовательском интерфейсе.

Одним из способов решения этой проблемы является создание ненулевой коллекции объектов со строковым полем с именем «name».

, например

class People
{
   string Name {get;set;}  
}

...
...

var list = new List<People> {new People {Name = "Fred"},
                             new People {Name = null},
                             new People {Name = "Jane"},
                             };

Это будет означать, что ни один элемент в списке не будет иметь значение NULL.

Затем в Binding of DataTemplate используйте: -

Text="{Binding Path=Name, TargetNullValue=None}"

SelectedItem для каждого элемента теперь будет отличным от NULL, даже если имя равно NULL, но недостатком для вас является то, что SelectedItem больше не является строкой выбранного имени, а является ссылкой на выбранный объект People. .

...