ComboBox SelectedValue不显示

时间:2012-07-14 09:27:02

标签: xaml mvvm windows-8 viewmodel windows-runtime

我的WinRT / C#XAML Metro应用程序中有一个奇怪的问题,使用Windows 8 Release Preview(安装了最新的补丁)。我正在使用ComboBox,其值ItemsSourceSelectedValue绑定到ViewModel中的属性:

<ComboBox SelectedValue="{Binding MySelectedValue, Mode=TwoWay}"
          ItemsSource="{Binding MyItemsSource, Mode=OneWay}"
          Width="200" Height="30" />

代码背后:

public MainPage()
{
    this.InitializeComponent();

    DataContext = new TestViewModel();
}

使用字符串<{1}}的非常简单的定义:

TestViewModel

现在我认为这个简单的解决方案应该正常工作......但是当我启动应用时,public class TestViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private IEnumerable<string> _myItemsSource = new List<string> { "Test Item 1", "Test Item 2", "Test Item 3" }; public IEnumerable<string> MyItemsSource { get { return _myItemsSource; } } private string _mySelectedValue = "Test Item 2"; public string MySelectedValue { get { return _mySelectedValue; } set { _mySelectedValue = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("MySelectedValue")); } } } } 没有显示,SelectedValue="Test Item 2"保持为空。通过设置断点,我注意到当我设置视图的ComboBox时,从视图模型中核心地检索了绑定值MyItemsSourceMySelectedValue。执行此操作后,DataContext属性实际上设置为ComboBox.SelectedValue,但它没有显示!另外我注意到,当我在UI上通过用户操作更改ComboBox中的选定值时,更改的值显示在ComboBox中,并且View Model属性会相应地更新。所以除了"Test Item 2"视图模型属性的初始可视化之外,一切似乎都能正常工作。我变得非常绝望......

现在虽然这是最简单的示例,但在原点我想将整个实体绑定到ComboBox,设置MySelectedValueDisplayMemberPath。不幸的是,同样的问题也出现了。

2 个答案:

答案 0 :(得分:30)

我在我的示例中发现了问题:在XAML标记中,我在<{strong> SelectedValue属性之前定义了ItemsSource属性。如果我以这种方式交换两个定义,它可以工作:

<ComboBox ItemsSource="{Binding MyItemsSource, Mode=OneWay}"
      SelectedValue="{Binding MySelectedValue, Mode=TwoWay}"
      Width="200" Height="30" />

这真奇怪而烦人。现在我想知道:这是一个bug还是设计?我认为这是一个错误,因为无论XAML中定义属性的顺序如何,控件都应该正常工作。

答案 1 :(得分:2)

这是有效的解决方案:您可以在此处找到https://skydrive.live.com/?cid=b55690d11b67401d&resid=B55690D11B67401D!209&id=B55690D11B67401D!209

<ComboBox Width="300" Height="32" HorizontalAlignment="Left" DisplayMemberPath="Name"
                  VerticalAlignment="Top" ItemsSource="{Binding PersonCollection}" 
                  SelectedItem="{Binding SelectedPerson, Mode=TwoWay}"></ComboBox>

ViewModle类是

public class ViewModel:BaseViewModel
    {
        private Person selectedPerson;
        public Person SelectedPerson {
            get { return this.selectedPerson; }
            set { this.selectedPerson = value;
            this.RaisePropertyChanged("SelectedPerson");
            }
        }
        public ObservableCollection<Person> PersonCollection { get; set; }

        public ViewModel()
        {
            this.PersonCollection = new ObservableCollection<Person>();
            this.PopulateCollection();

            //setting first item as default one
            this.SelectedPerson = this.PersonCollection.FirstOrDefault();
        }

        private void PopulateCollection()
        {
            this.PersonCollection.Add(new Person { Name="Oscar", Email="oscar@sl.net" });
            this.PersonCollection.Add(new Person { Name = "Jay", Email = "jay@sl.net" });
            this.PersonCollection.Add(new Person { Name = "Viral", Email = "viral@sl.net" });
        }
    }