Mvvm 组合框中显示的当前值

Mvvm 组合框中显示的当前值,mvvm,wpf-controls,caliburn.micro,Mvvm,Wpf Controls,Caliburn.micro,当组合框中的项目是数据库中的自定义对象时,我似乎无法获取要在组合框中显示的当前选定值。我将下面的测试视图模型和视图放在一起。SimpleWidgets和ObjectWidgets的行为与预期一致。CodeWidget(作为自定义“代码”对象从数据库检索的列表)从不显示SelectedCodeWidget 公共类TestViewModel:BaseTabViewModel { 私有列表simpleWidgets; 公共列表SimpleWidgets { 获取{return simpleWidget

当组合框中的项目是数据库中的自定义对象时,我似乎无法获取要在组合框中显示的当前选定值。我将下面的测试视图模型和视图放在一起。SimpleWidgets和ObjectWidgets的行为与预期一致。CodeWidget(作为自定义“代码”对象从数据库检索的列表)从不显示SelectedCodeWidget

公共类TestViewModel:BaseTabViewModel
{
私有列表simpleWidgets;
公共列表SimpleWidgets
{
获取{return simpleWidgets;}
设置
{
simpleWidgets=值;
NotifyOfPropertyChange(()=>SimpleWidgets);
}
}
私有int-selectedSimpleWidget;
public int SelectedSimpleWidget
{
获取{return selectedSimpleWidget;}
设置
{
selectedSimpleWidget=值;
NotifyOfPropertyChange(()=>SelectedSimpleWidget);
}
}
私有列表对象控件;
公共列表ObjectWidgets
{
获取{return objectWidgets;}
设置
{
objectWidgets=值;
NotifyOfPropertyChange(()=>ObjectWidgets);
}
}
私有小部件(u selectedObjectWidget);
公共小部件SelectedObjectWidget
{
获取{return\u selectedObjectWidget;}
设置
{
_selectedObjectWidget=值;
NotifyOfPropertyChange(()=>SelectedObjectWidget);
}
}
私有列表代码部件;
公共列表代码部件
{
获取{return codeWidgets;}
设置
{
codeWidgets=值;
NotifyOfPropertyChange(()=>CodeWidgets);
}
}
专用代码_selectedCodeWidget;
公共代码SelectedCodeWidget
{
获取{return\u selectedCodeWidget;}
设置
{
_selectedCodeWidget=值;
NotifyOfPropertyChange(()=>SelectedCodeWidget);
}
}
公共TestViewModel()
{
DisplayName=“测试数据”;
IsEnabled=true;//使用权限控制此
//简单整数组合框
SimpleWidgets=新列表{1,3,5,7,9};
选择SimpleWidget=7;
//对象填充组合框
ObjectWidgets=新列表();
Widget w=newwidget{Key=2,Description=“test2”};
ObjectWidgets.Add(w);
w=新小部件{Key=4,Description=“test4”};
ObjectWidgets.Add(w);
w=新小部件{Key=6,Description=“test6”};
ObjectWidgets.Add(w);
SelectedObjectWidget=w;
//代码填充组合框
CodeWidgets=(new Code().Get(“UPFLTY”).Result).ToList();
SelectedCodeWidget=新代码(2707);
}
}
公共类小部件
{
公共int密钥{get;set;}
公共字符串说明{get;set;}
}
TestView.xaml是:

<UserControl x:Class="CAB.DataManager.App.Views.TestView"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UniformGrid>

        <ComboBox Name="SimpleWidgets"></ComboBox>
            <ComboBox Name="ObjectWidgets"
                     DisplayMemberPath="Description" >
             </ComboBox>
        <ComboBox x:Name="CodeWidgets">
                 <ComboBox.ItemTemplate>
                     <DataTemplate>
                        <StackPanel>
                            <TextBox Text="{Binding Description}"/>
                        </StackPanel>
                     </DataTemplate>
                 </ComboBox.ItemTemplate>
        </ComboBox>
    </UniformGrid>
</UserControl>

SimpleWidgets和ObjectWidgets显示选定的值,并在下拉列表中显示所有值。CodeWidgets为空,但下拉列表中包含所有值。我错过了什么?

SelectedItem
中的实例必须存在于

从你的代码

//代码填充组合框
CodeWidgets=(new Code().Get(“UPFLTY”).Result).ToList();
SelectedCodeWidget=新代码(2707);//这就是你窃听的地方!
您可以看到
SelectedCodeWidget
被设置为
code
的新实例,该实例不在
codewidget

答案很简单,只需执行以下操作:

//代码填充组合框
CodeWidgets=(new Code().Get(“UPFLTY”).Result).ToList();
var selectedCode=findcodebydrp(CodeWidgets,2707);//做这个方法
SelectedCodeWidget=selectedCode;
其中,
findcodebydrp
是您编写的一种方法,它搜索
codewidget
中的实例,并返回2707中最难的实例。不管那意味着什么。我的意思是,你已经有了一个代码升级,但是你创建了另一个实例,并传入2707。。。这毫无意义。是的。

SelectedItem
中的实例必须存在于

从你的代码

//代码填充组合框
CodeWidgets=(new Code().Get(“UPFLTY”).Result).ToList();
SelectedCodeWidget=新代码(2707);//这就是你窃听的地方!
您可以看到
SelectedCodeWidget
被设置为
code
的新实例,该实例不在
codewidget

答案很简单,只需执行以下操作:

//代码填充组合框
CodeWidgets=(new Code().Get(“UPFLTY”).Result).ToList();
var selectedCode=findcodebydrp(CodeWidgets,2707);//做这个方法
SelectedCodeWidget=selectedCode;

其中,
findcodebydrp
是您编写的一种方法,它搜索
codewidget
中的实例,并返回2707中最难的实例。不管那意味着什么。我的意思是,你已经有了一个代码升级,但是你创建了另一个实例,并传入2707。。。这毫无意义。是的。

WPF的组合框通过引用将SelectedItem与ItemsSource中的项进行比较,在您的例子中,
新代码(2707)
的实例与
中的实例(new code().Get(“UPFLTY”).Result)不完全相同。ToList()

避免这种情况的最常见方法是在具有通用对象类型的对象上使用
SelectedValue
SelectedValuePath

比如说,

<ComboBox x:Name="CodeWidgets" 
          SelectedValue="{Binding SelectedCodeId}" 
          SelectedValuePath="Id">
第三种解决方案(通常不推荐)是覆盖对象的
.Equals
,这样它就可以通过引用以外的内容来比较项目

公共覆盖boo