我有一个叫做
Project
的物体。该项目有一个名为 ProjectState
的字段。以前这个字段是enum
,所以非常好办。它被绑定为 ItemSource
到 ComboBox
,没什么特别的。现在用户想要创建自己的列表,用他的项目填充 ComboBox
。这里最好的方法是什么?ProjectState
,并让用户用他的项目填充列表。因此,最终我将在 ProjectState
和 Project
之间创建一对多关系。当然,我必须注意,如果 ProjectState
项目有任何相关项目,则用户无法删除该项目。ProjectState
也应该显示在这个列表中。因此我总是需要加载相关的ProjectState
来查看它的State而不是Id。我在这里遇到性能问题吗?
我尝试了之前描述的解决方案。它对我有用,但我想确保我走在正确的道路上,因为我会在我的项目中多次实现这一点。
让我向您展示一个简单的例子:
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>