#wpf #listview #multibinding
#wpf #listview #многозадачность
Вопрос:
У меня есть ListView, в котором есть несколько столбцов. У меня нет проблем с привязкой каждого GridViewColumn к свойству, например:
<ListView ItemsSource="{Binding MyList}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Name}">
<GridViewColumnHeader Content="Name"/>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
Проблемы начинаются, когда я пытаюсь многозадачно связать столбец GridViewColumn с двумя свойствами:
<GridViewColumn>
<GridViewColumn.DisplayMemberBinding>
<MultiBinding Converter="{StaticResource DisplayMemberConverter}">
<Binding Path="HighestScore"/>
<Binding Path="IsHighestScoreApplicable"/>
</MultiBinding>
</GridViewColumn.DisplayMemberBinding>
<GridViewColumnHeader Content"Highest_Score"/>
Конвертер, который я использую, приведен здесь:
public class DisplayMemberConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
int int_value = (int)values[0];
bool bool_value = (bool)values[1];
if (bool_value == true)
return int_value;
return null;
}
...
}
Я хочу добиться эффекта, что когда свойство ‘ISHIGHESTSCORE Applicable’ имеет значение false — в представлении списка ничего не отображается (пустое), а когда оно равно true — отображается значение HighestScore, но это не работает — все, что я получаю, это пустой столбец, даже когда значение «ISHIGHESTSCORE Applicable» равно true.
Кроме того, когда я отлаживаю метод Convert(), я вижу, что оператор if:
if (bool_value == true)
выполняется, и возвращаемое значение равно int_value , но в представлении списка по-прежнему ничего не отображается.
Что не так?
Всего наилучшего, Дэйв
Ответ №1:
Пару минут назад мне понадобилась многозадачность в представлении списка.
Как я это сделал:
Я создал datatemplate для ячейки. Datatemplate содержит текстовый блок, для этого текстового блока мы выполняем многозадачность.
<ListView Margin="33,0,0,0" ItemsSource="{Binding HourRegistry}">
<ListView.View>
<GridView>
<GridViewColumn Width="200" Header="Worker" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="Employee.FirstName" />
<Binding Path="Employee.Name" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="100" Header="Job" DisplayMemberBinding="{Binding Path=Keycode}"/>
</GridView>
</ListView.View>
Может быть, поздно, но удобно для других людей
Ответ №2:
DisplayMemberBinding
как следует из названия, это не значение, а привязка, которая указывает на элемент (свойство), который должен отображаться. Вы можете использовать CellTemplate
, если у вас есть сложные способы извлечения значения.
(Чтобы проиллюстрировать приведенное выше объяснение: ваш конвертер может возвращать DisplayMemberBinding="42"
, что выглядит довольно неуместно, поскольку привязка или элемент не найдены.)
Ответ №3:
Просто попробуйте
if (bool_value == true)
return int_value.ToString();
Это сработало, когда я воспроизвел вашу проблему