WPF中使用MVVM模式控制布局控件的内容

本文探讨了如何在WPF中利用ItemsControl结合MVVM模式,通过ItemsSource和ItemsPanel属性实现实时添加和删除UniformGrid布局中的子控件,以适应布局元素数量的不确定性。
摘要由CSDN通过智能技术生成

WPF内置了多种布局控件,如GridStackPannel等,用来布局很方便。但这些控件并没有ItesmSource属性,无法使用MVVM模式绑定实现子控件的动态添加和删除。例如,我们可以用UniformGrid快速实现等分网格布局:

<UniformGrid>
    <Border BorderThickness="1 1 1 1" BorderBrush="gray">
        <StackPanel Orientation="Vertical">
            <TextBlock Text="WPF" Margin="5 10" Foreground="Blue"/>
            <TextBlock Text="微软的用户界面框架。" Margin="5 10" Foreground="Black" TextWrapping="WrapWithOverflow"/>
        </StackPanel>
    </Border>
    <Border BorderThickness="1 1 1 1" BorderBrush="gray">
        <StackPanel Orientation="Vertical">
            <TextBlock Text="Electron" Margin="5 10" Foreground="Blue"/>
            <TextBlock Text="使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。" Margin="5 10" Foreground="Black" TextWrapping="WrapWithOverflow"/>
        </StackPanel>
    </Border>
    <Border BorderThickness="1 1 1 1" BorderBrush="gray">
        <StackPanel Orientation="Vertical">
            <TextBlock Text="Qt" Margin="5 10" Foreground="Blue"/>
            <TextBlock Text="跨平台C++图形用户界面应用程序开发框架。" Margin="5 10" Foreground="Black" TextWrapping="WrapWithOverflow"/>
        </StackPanel>
    </Border>
    <Border BorderThickness="1 1 1 1" BorderBrush="gray">
        <StackPanel Orientation="Vertical">
            <TextBlock Text="Swing" Margin="5 10" Foreground="Blue"/>
            <TextBlock Text="为 Java 设计的 GUI 工具包。" Margin="5 10" Foreground="Black" TextWrapping="WrapWithOverflow"/>
        </StackPanel>
    </Border>
</UniformGrid>

效果如下:
在这里插入图片描述

但是当布局元素数量不确定时,动态添加子控件就很不方便,因为UniformGrid并没有类似ItemSource的属性。WPF的精髓在于MVVM,如何使用MVVM模式实现对布局控件内容的控制呢?对此,我们可以使用ItemsControlItemsPanel属性实现。

首先,定义ViewModel:

public class MainViewModel
{
    public MainViewModel()
    {
        //初始化列表内容
        Items.Add(new ItemInfo { Name = "WPF", Text = "微软的用户界面框架。" });
        Items.Add(new ItemInfo { Name = "Electron", Text = "使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。" });
        Items.Add(new ItemInfo { Name = "Qt", Text = "跨平台C++图形用户界面应用程序开发框架。" });
        Items.Add(new ItemInfo { Name = "Swing", Text = "为 Java 设计的 GUI 工具包。" });
    }
    //供绑定的属性
    public ObservableCollection<ItemInfo> Items { get; set; } = new ObservableCollection<ItemInfo>();
}
public class ItemInfo
{
    public string Name { get; set; }
    public string Text { get; set; }
}

然后,使用ItemsControl,绑定Items属性,并将UniformGrid控件提供给ItemsPanel属性

<ItemsControl ItemsSource="{Binding Items}">
    <!--指定子项目容器为UniformGrid控件-->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!--指定子项目模板-->
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="1 1 1 1" BorderBrush="gray">
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Name}" Margin="5 10" Foreground="Blue"/>
                    <TextBlock Text="{Binding Text}" Margin="5 10" Foreground="Black" TextWrapping="WrapWithOverflow"/>
                </StackPanel>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

效果图如下:
在这里插入图片描述

在ViewModel中控制Items属性,便可实现子控件的动态增减。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值