gpt4 book ai didi

wpf - ListView 数据模板绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 02:30:21 29 4
gpt4 key购买 nike

我有以下 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 值绑定(bind)。该转换器是一个简单的 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;
}
}

复选框可见性的绑定(bind)对我不起作用。默认 IsChecked 值为 false,因此列表显示时没有复选框。如果我选择一个项目,复选框不会出现。

但是,如果我将 IsChecked 的默认值设置为 true,所有列表项都会显示一个复选框,如果我选择一个项目然后取消选择它,该复选框就会正确消失。

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

有什么地方出错了吗?

最佳答案

手动将第一个 GridViewColumn 的宽度设置为固定值。如果 ListView 什么都不包含,它似乎将其宽度设置为零,并且当复选框开始出现时不更新宽度。

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

关于wpf - ListView 数据模板绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4018181/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com