为组合框(EF、WPF、MVVM、C#)创建用户定义列表的最佳方法?

问题描述 投票:0回答:1

我有一个叫做

Project
的物体。该项目有一个名为
ProjectState
的字段。以前这个字段是
enum
,所以非常好办。它被绑定为
ItemSource
ComboBox
,没什么特别的。现在用户想要创建自己的列表,用他的项目填充
ComboBox
。这里最好的方法是什么?
如果用户更改列表中的某个项目,则所有现有记录中都应更改该项目。我的想法是创建一个类
ProjectState
,并让用户用他的项目填充列表。因此,最终我将在
ProjectState
Project
之间创建一对多关系。当然,我必须注意,如果
ProjectState
项目有任何相关项目,则用户无法删除该项目。
因为我经常会遇到这种情况,所以我只是想确保自己走在正确的道路上。这是一个好方法,还是有更好的方法?
另一个想法是,用户将看到一个项目列表,当然
ProjectState
也应该显示在这个列表中。因此我总是需要加载相关的
ProjectState
来查看它的State而不是Id。我在这里遇到性能问题吗?

我尝试了之前描述的解决方案。它对我有用,但我想确保我走在正确的道路上,因为我会在我的项目中多次实现这一点。

c# wpf entity-framework mvvm
1个回答
0
投票

让我向您展示一个简单的例子:

MainViewModel.cs

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.Windows;

namespace WpfApp1;

public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    private ObservableCollection<string> _items = [];

    public MainViewModel()
    {
        // If necessary, initialize `Items`.
        Items.Add("Item 1");
        Items.Add("Item 2");
    }

    [RelayCommand]
    private void AddItem(string item)
    {
        if (string.IsNullOrEmpty(item) is true)
        {
            return;
        }

        Items.Add(item);
    }
}

然后在 XAML 中:

MainWindow.xaml

<Window
    x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Window.DataContext>
        <local:MainViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <StackPanel
            Grid.Row="0"
            Orientation="Horizontal">
            <TextBox x:Name="NewItemTextBox" />
            <Button
                Command="{Binding AddItemCommand}"
                CommandParameter="{Binding ElementName=NewItemTextBox, Path=Text}"
                Content="Add" />
        </StackPanel>
        <ComboBox
            Grid.Row="1"
            ItemsSource="{Binding Items}" />
    </Grid>
</Window>
© www.soinside.com 2019 - 2024. All rights reserved.