Многозадачность в представлении списка

#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();
  

Это сработало, когда я воспроизвел вашу проблему