如何恢复ComboBox的状态?

时间:2018-04-03 13:59:04

标签: c# wpf mvvm data-binding combobox

我的NamedFoos中有一组对象ViewModel,表示组合框控件的可用选项。

问题在于,当我序列化绑定变量然后在稍后的应用程序运行中再次反序列化时,组合框不会显示绑定到的对象的值

组合框在启动时为空。

empty combobox

问题的根源似乎是新创建的项目未被识别为集合的元素。

我写了一个小测试应用程序,可以通过简单地为绑定变量的基础字段赋值来重现问题(参见下面的代码)。

如果我从

更改作业
_selectedFoo = new Bar(2);

_selectedFoo = NamedFoos[1];

它按预期工作。

我知道只对选择索引进行de / /序列化可以解决问题,但是需要序列化整个对象。

如果组合框不属于ItemsSource集合,我怎样才能让组合框显示恢复后的值

XAML

<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";
        }
    }
}

0 个答案:

没有答案