代码隐藏中的WPF列表视图预选复选框

d4so4syb  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(128)

我在wpf应用程序中有一个用复选框填充的列表视图。


的数据
我将“选中”的值存储在配置文件中,每次打开程序时,我都想读取这些值并在列表视图中预先选择它们。我该怎么做?

XML格式

<ListView ItemsSource="{Binding ClassificationTypes}" SelectionMode="Multiple" ItemContainerStyle="{StaticResource CheckListView}" SelectionChanged="OnClassification_SelectionChanged" />

字符串

静态资源XML

<Style x:Key="CheckListView" TargetType="ListViewItem">
    <Setter Property="OverridesDefaultStyle" Value="true" />
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
                <CheckBox Margin="5,2" IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsSelected, Mode=TwoWay}">
                    <ContentPresenter />
                </CheckBox>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

代码隐藏

我正在用枚举值填充列表。

public ObservableCollection<string> ClassificationTypes { get; set; }

ClassificationTypes = new ObservableCollection<string>();
IEnumerable<ClassTypes> types = Enum.GetValues(typeof(ClassTypes)).Cast<ClassTypes>();

foreach (ClassTypes type in types)
{
    string description = EnumExtensions.GetDescription(type);
    ClassificationTypes.Add(description);
}


当我启动程序时,它读入配置文件,但此时,ListView.Items.Count为0,所以我不能循环通过它们。只有在初始化完成后,它才开始提取所有绑定的数据以显示。如何在显示前预先选择某些值?

bvuwiixz

bvuwiixz1#

您可以有一个视图模型,其中的数据项类具有字符串和bool属性。根据您的具体要求,您可能必须添加通常的INotifyPropertyChanged实现。

public class DataItem
{
    public string Text { get; set; }
    public bool Selected { get; set; }
}

public class ViewModel
{
    public ObservableCollection<DataItem> Items { get; }
        = new ObservableCollection<DataItem>();
}

字符串
将其与列表框一起使用,如下所示。如果未设置更复杂的ListView控件的View属性,请不要使用该控件。

<ListBox ItemsSource="{Binding Items}" SelectionMode="Multiple">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsSelected" Value="{Binding Selected}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <CheckBox Margin="5,2"
                                  IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                                  Content="{Binding Text}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>


一些测试数据:

public MainWindow()
{
    InitializeComponent();

    var vm = new ViewModel();
    vm.Items.Add(new DataItem { Text = "Unclassified", Selected = false });
    vm.Items.Add(new DataItem { Text = "Human", Selected = true });
    vm.Items.Add(new DataItem { Text = "Small Vehicle", Selected = false });
    vm.Items.Add(new DataItem { Text = "Large Vehicle", Selected = true });
    vm.Items.Add(new DataItem { Text = "Drone", Selected = false });
    vm.Items.Add(new DataItem { Text = "Small Airplane", Selected = true });
    vm.Items.Add(new DataItem { Text = "Large Airplane", Selected = false });

    DataContext = vm;
}

相关问题