ListView数据模板绑定

4

我有以下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中复选框的可见性与ListViewItem的IsChecked值绑定。转换器是一个简单的bool到可见性的转换器:
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

我知道这个问题已经有答案了,但我用以下方法解决了这个问题:

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

而在窗口中,我为MyItem类型定义了一个DataTemplate:

<Window.Resources>
        <DataTemplate DataType="{x:Type myViewModels:MyItemViewModel}" x:Key="myTemplate" >
           ...template code
        </DataTemplate>
</Window.Resources>

1
手动将第一个GridViewColumn的宽度设置为固定值。如果ListView中不包含任何内容,则它似乎将其宽度设置为零,并且在复选框开始出现时不更新宽度。
或者,更改BoolToVisibilityConverter的代码,使其返回Visibility.Hidden而不是Visibility.Collapsed。

为了在UI上为元素添加隐藏的空间,Hidden会起作用,而Collapsed则不会。 - Aaron McIver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接