gpt4 book ai didi

wpf - SelectedItem 未显示在 ComboBox 中

转载 作者:行者123 更新时间:2023-12-03 10:22:36 25 4
gpt4 key购买 nike

我在带有 C# 的 WPF 应用程序中使用 MVVM,但在正确绑定(bind) ComboBox 时遇到问题。

这是我在 XAML 中的 ComboBox 行:

<ComboBox ItemsSource="{Binding Repository.Models}" SelectedValue="{Binding Repository.SelectedModel}" DisplayMemberPath="Name"></ComboBox>

这是我的存储库中有趣的部分:
 class Repository : INotifyPropertyChanged
{
//init MVVM pattern
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

private ObservableCollection<Model> _models;
public ObservableCollection<Model> Models
{
get
{
return _models;
}

set
{
_models = value;
NotifyPropertyChanged("Models");
}
}

private Model _selectedModel;
public Model SelectedModel
{
get
{
return _selectedModel;
}

set
{
_selectedModel = value;
NotifyPropertyChanged("SelectedModel");
}
}

这是我的模型类中有趣的部分:
 abstract class Model : INotifyPropertyChanged
{
//init MVVM pattern
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

private string _name;
public string Name
{
get
{
return _name;
}

set
{
_name = value;
NotifyPropertyChanged("Name");
}
}

因此,当我选择/更改组合框的不同项目时,绑定(bind)到 Repository.SelectedModel.Parameters 的 DataGrid 会按照我的意愿进行更新。
因为我知道,绑定(bind)确实有效!

当我重新启动应用程序并调试到我的存储库时,我看到有一个 SelectedModel(在启动时反序列化)但 ComboBox 保持空白。尽管 DataGrid 确实显示了正确的数据。

所以绑定(bind)本身确实有效,但是与 ComboBoxLabel 的绑定(bind)以某种方式失败了。

我尝试了很多东西,比如在 SelectedItem 和 SelectedValue 之间、Binding 和 Binding Path 之间、IsSynchronizedWithCurrentItem true 和 false 之间切换,但到目前为止没有任何效果。

你看到我的错误了吗?
提前致谢!

编辑
这是我的 MainWindowViewModel 中有趣的部分:
class MainWindowViewModel : INotifyPropertyChanged
{
//init MVVM pattern
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

private Repository _repository;
public Repository Repository
{
get
{
return _repository;
}

set
{
_repository = value;
NotifyPropertyChanged("Repository");
}
}

这是我的 App.xaml.cs,我在其中初始化了我的 DataContext:
   //init point of app
public partial class App : Application
{
private MainWindowViewModel mainWindowViewModel;

//gets fired as the app starts
protected override void OnStartup(StartupEventArgs e)
{
//create the ViewModel
mainWindowViewModel = new MainWindowViewModel();

//create the mainWindow
var mainWindow = new MainWindow();
mainWindow.DataContext = mainWindowViewModel;

//show the mainWindow
mainWindow.Show();
}

最佳答案

When I restart the application and debug into my Repository, I see that there is a SelectedModel (deserialised on startup) but the ComboBox stays blank. The DataGrid though does show the right data.



看起来反序列化是问题所在。

您有一个已反序列化的选定项目。这意味着新的 Model创建的实例具有 Name不管什么,和 Properties那是什么。你有一个列表 Model ObservableCollection<Model> 中的实例它们显示在 ComboBox 中。

你向我们保证,至少在某些时候,你有 ComboBox.SelectedItem绑定(bind)到 SelectedModel ,但由于某种原因,您问题中的代码绑定(bind)了 ComboBox.SelectedValue反而。那是行不通的。方法如下 ComboBox.SelectedValue将被使用:
<ComboBox
ItemsSource="{Binding Repository.Models}"
SelectedValuePath="Name"
SelectedValue="{Binding SelectedModelName}"
/>

...你必须有一个 String SelectedModelName { get; set; }您的 View 模型上的属性。 Name所选 Model 的属性将由 ComboBox 分配给它when the selection changed.但是你没有 SelectedModelName ,而你不想要它,所以忘记 SelectedValue .

返回 SelectedItem . ComboBox获取 SelectedModel 的值从绑定(bind)中,并尝试在其项目列表中找到该确切对象。由于该确切对象不在该列表中,因此它不选择任何内容。 Repository.Models 中可能有一个项目具有相同名称且具有相同的 Properties ,但它与 Model 的实际实例不同类(class)。 ComboBox不寻找 SelectedItem 中值的同卵双胞胎;它寻找相同的对象。
SelectedModel.PropertiesDataGrid 工作因为 DataGrid不知道或不在乎 Models 中的内容.你给它一个收藏,很好。

所以:如果你想反序列化一个 SelectedModel并让它意味着什么,您需要做的是继续反序列化,然后在 Repository.Models 中找到等效项(相同的 Name ,相同的 Properties ),并将该实际对象实例分配给 SelectedModel .

你可能想重载 Model.Equals() .不。我这样做是为了解决同样的问题。在 C# 中不期望产生的行为,并且会在您最不期望的时候咬住您,因为您正在无形地改变框架代码中发生的行为。我已经花了好几天的时间来追踪我以这种方式创建的错误,而且我再也不会对自己这样做了。

关于wpf - SelectedItem 未显示在 ComboBox 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37575894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com