【问题标题】:ListView DataTemplate bindingListView 数据模板绑定
【发布时间】:2011-04-30 09:52:11
【问题描述】:

我有以下列表视图:

    <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 值绑定。该转换器是一个简单的布尔到可见性转换器:

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,则所有列表项都会出现一个复选框,如果我选择一个项目然后取消选择它,则该复选框会正确消失。

我想要实现的是所有项目都从没有复选框开始,选择一个项目显示一个选中的复选框,取消选择一个项目隐藏复选框。

任何想法我哪里出错了?

【问题讨论】:

    标签: wpf wpf-controls binding


    【解决方案1】:

    手动将第一个 GridViewColumn 的宽度设置为固定值。如果 ListView 不包含任何内容并且在复选框开始出现时不更新宽度,则似乎 ListView 将其宽度设置为零。

    或者,更改 BoolToVisibilityConverter 的代码以返回 Visibility.Hidden 而不是 Visibility.Collapsed。

    【讨论】:

    • 在 UI 上进一步添加 Hidden 为元素留出空间,而 Collapsed 则没有。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      相关资源
      最近更新 更多