Мультисвязывание в виде списка - PullRequest
2 голосов
/ 18 мая 2011

У меня есть 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;
    }

   ...    
}

Я хочу добиться эффекта, когда свойство IsHighestScoreApplicable имеет значение false - в представлении списка (пустое) ничего не отображается, а когда оно равно true -показано значение HighestScore, но это не сработает - все, что я получаю, - это пустой столбец, даже когда значение IsHighestScoreApplicable равно true.Кроме того, когда я отлаживаю метод Convert (), я вижу, что выполняется оператор if:

 if (bool_value == true)

, и возвращаемое значение равно int_value, но все равно ничего не отображается в представлении списка.

Что не так?

Всего наилучшего, Дейв

Ответы [ 3 ]

8 голосов
/ 03 апреля 2013

Пару минут назад мне потребовалось связывание нескольких объектов в виде списка.

Как я это сделал:

Я сделал табличку с данными для клетки. В табличке данных содержится текстовый блок, в этом текстовом блоке мы выполняем мультисвязывание.

<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>

Может быть поздно, но удобно для других людей

0 голосов
/ 18 мая 2011

Просто попробуйте

if (bool_value == true)
        return int_value.ToString();

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

0 голосов
/ 18 мая 2011

DisplayMemberBinding - это, как следует из названия, не значение, а привязка, которая указывает на элемент (свойство), который должен отображаться.Вы можете использовать CellTemplate, если у вас есть сложные способы получения значения.

( Чтобы проиллюстрировать вышеприведенное объяснение: ваш конвертер может вернуть DisplayMemberBinding="42", что выглядит довольно страннопоскольку нет привязки или члена, который будет найден. )

...