我的NamedFoos
中有一组对象ViewModel
,表示组合框控件的可用选项。
问题在于,当我序列化绑定变量然后在稍后的应用程序运行中再次反序列化时,组合框不会显示绑定到的对象的值。
组合框在启动时为空。
问题的根源似乎是新创建的项目未被识别为集合的元素。
我写了一个小测试应用程序,可以通过简单地为绑定变量的基础字段赋值来重现问题(参见下面的代码)。
如果我从
更改作业_selectedFoo = new Bar(2);
到
_selectedFoo = NamedFoos[1];
它按预期工作。
我知道只对选择索引进行de / /序列化可以解决问题,但是需要序列化整个对象。
如果组合框不属于ItemsSource
集合,我怎样才能让组合框显示恢复后的值?
<Window x:Class="test_app.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:test_app"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:ViewModel x:Name="ViewModel"/>
</Window.DataContext>
<StackPanel>
<ComboBox ItemsSource="{Binding NamedFoos}"
SelectedItem="{Binding SelectedFoo}"
DisplayMemberPath="ComboBoxDisplayName"/>
</StackPanel>
using System.Runtime.Serialization;
namespace test_app
{
public class ViewModel
{
private Foo _selectedFoo;
public ViewModel()
{
_selectedFoo = new Bar(2);
}
public Foo[] NamedFoos { get; } =
{
new Foo(1),
new Bar(2)
};
public Foo SelectedFoo
{
get => _selectedFoo;
set => _selectedFoo = value;
}
[DataContract]
public class Foo
{
[DataMember]
public int Num { get; set; }
public Foo(int num)
{
Num = num;
}
public virtual string ComboBoxDisplayName => "foo";
}
class Bar : Foo
{
public Bar(int num) : base(num)
{
}
public override string ComboBoxDisplayName => "bar";
}
}
}