You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF从ViewModel向View添加Expander仅显示集合如何解决

问题原因

  • 违反MVVM设计原则,ViewModel层直接持有View层的Expander控件实例,ViewModel仅需存放业务数据,不应引用任何UI控件
  • ContentControl仅支持渲染单个内容,你绑定了集合类型的MyExpanders,WPF默认会调用集合的ToString()方法渲染,你的系统是德语环境所以显示Sammlung(集合的德语翻译)

解决方案

第一步:创建Expander对应的数据模型(放在ViewModel层)

public class ExpanderItem : BindableBase
{
    private string _header;
    public string Header
    {
        get => _header;
        set => SetProperty(ref _header, value);
    }

    private string _content;
    public string Content
    {
        get => _content;
        set => SetProperty(ref _content, value);
    }

    private bool _isExpanded;
    public bool IsExpanded
    {
        get => _isExpanded;
        set => SetProperty(ref _isExpanded, value);
    }
}

第二步:修改MyViewModel代码

public class MyViewModel : BindableBase
{
    public MyViewModel()
    {
        // 用ObservableCollection代替List,支持集合元素增减时自动通知UI更新
        MyExpanders = new ObservableCollection<ExpanderItem>();
        AddAllExpanders();
    }

    private void AddAllExpanders()
    {
        AddExpander("First expander header", "First expander content");
        AddExpander("Second expander header", "Second expander content");
    }

    private void AddExpander(string header, string content)
    {
        MyExpanders.Add(new ExpanderItem
        {
            Header = header,
            Content = content,
            IsExpanded = false
        });
    }

    private ObservableCollection<ExpanderItem> _myExpanders;
    public ObservableCollection<ExpanderItem> MyExpanders
    {
        get => _myExpanders;
        set => SetProperty(ref _myExpanders, value);
    }
}

第三步:修改XAML代码,用ItemsControl渲染集合

<UserControl x:Class="MyProject.Views.MyView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyProject.Views"
             x:Name="Info"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="2*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="1">
            <!-- 用ItemsControl渲染集合,替换原来的ContentControl -->
            <ItemsControl ItemsSource="{Binding MyExpanders}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Expander Header="{Binding Header}"
                                  Content="{Binding Content}"
                                  IsExpanded="{Binding IsExpanded, Mode=TwoWay}"
                                  HorizontalAlignment="Stretch"
                                  Margin="10"
                                  Background="LightGray"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </Grid>
</UserControl>

内容的提问来源于stack exchange,提问作者Anno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:36:04