Привязка ListView DataTemplate - PullRequest
       3

Привязка ListView DataTemplate

3 голосов
/ 25 октября 2010

У меня есть следующее ListView:

    <ListView Name="listView">
            <ListView.View>
                <GridView>
                    <GridView.ColumnHeaderContainerStyle>
                        <Style TargetType="{x:Type GridViewColumnHeader}">
                            <Setter Property="Visibility"
                                    Value="Collapsed"/>
                        </Style>
                    </GridView.ColumnHeaderContainerStyle>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <CheckBox
                                          Margin="0"
                                          VerticalAlignment="Center"
                                          IsChecked="{Binding IsChecked}"
                                          Visibility="{Binding IsChecked, Converter={StaticResource boolToVis}}">
                                    </CheckBox>
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Margin="0"
                                           Text="{Binding Text}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

Элементы в ListView имеют следующий тип:

public class CheckBoxListViewItemSource : INotifyPropertyChanged
{
    public CheckBoxListViewItemSource(String text)
    {
        m_text = text;
    }

    public bool IsChecked
    {
        get { return m_checked; }
        set
        {
            if (m_checked == value) return;
            m_checked = value;
            RaisePropertyChanged("IsChecked");
        }
    }

    public String Text
    {
        get { return m_text; }
        set
        {
            if (m_text == value) return;
            m_text = value;
            RaisePropertyChanged("Text");
        }
    }

    public override string ToString()
    {
        return Text;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propName)
    {
        PropertyChangedEventHandler eh = PropertyChanged;
        if (eh != null)
        {
            eh(this, new PropertyChangedEventArgs(propName));
        }
    }

    private bool m_checked;
    private String m_text;
}

Видимость флажка в ListView связана сзначение IsChecked объекта ListViewItem.Конвертер - это простой конвертер типа bool to visibility:

public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                          CultureInfo culture)
    {
        if (value is Boolean)
        {
            return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                              CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

В коде ListView, который у меня есть:

    void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        foreach (var item in e.RemovedItems)
        {
            CheckBoxListViewItemSource source = item as CheckBoxListViewItemSource;
            source.IsChecked = false;
        }
        foreach (var item in e.AddedItems)
        {
            CheckBoxListViewItemSource source = item as CheckBoxListViewItemSource;
            source.IsChecked = true;
        }
    }

Привязка для флажка видимости не работает для меня.Значение IsChecked по умолчанию равно false, поэтому список отображается без флажков.Если я выбираю элемент, флажок не появляется.

Однако, если я устанавливаю значение по умолчанию IsChecked равным true, все элементы списка отображаются с флажком, и если я выбираю элемент, а затем отменяю его выборфлажок корректно исчезает.

Я пытаюсь добиться того, чтобы все элементы начинались без флажка, при выборе элемента отображается флажок, а при снятии выбора элемента флажок скрывается.

Есть идеи, где я иду не так?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Я знаю, что на этот вопрос ответили, но я обошёл эту проблему, используя следующее:

 <GridViewColumn Header="MyColumn">
       <GridViewColumn.CellTemplate>
              <DataTemplate>
                    <ContentPresenter Content="{Binding MyItem, UpdateSourceTrigger=PropertyChanged}" ContentTemplate="{StaticResource myTemplate}"/>
              </DataTemplate>
         </GridViewColumn.CellTemplate>
 </GridViewColumn>

И в окне я определил DataTemplate для типа, которым был MyItem:

<Window.Resources>
        <DataTemplate DataType="{x:Type myViewModels:MyItemViewModel}" x:Key="myTemplate" >
           ...template code
        </DataTemplate>
</Window.Resources>
1 голос
/ 25 октября 2010

Вручную установите ширину первого GridViewColumn в фиксированное значение.Кажется, ListView устанавливает его ширину в ноль, если он ничего не содержит, и не обновляет ширину, когда начинают появляться флажки.

В качестве альтернативы измените код BoolToVisibilityConverter, чтобы он возвращал Visibility.Hidden вместо Visibility.Collapsed.

...