2012-07-14 103 views
9

使用Windows 8 Release Preview(已安裝最新的修補程序),我的WinRT/C#XAML Metro應用程序出現了一個奇怪的問題。我使用的是ComboBox,其值ItemsSourceSelectedValue必然屬性在視圖模型:ComboBox SelectedValue不顯示

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

後面的代碼:

public MainPage() 
{ 
    this.InitializeComponent(); 

    DataContext = new TestViewModel(); 
} 

而且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留空。通過設置斷點,我注意到當我設置視圖的DataContext時,從視圖模型中正確檢索了綁定值MyItemsSourceMySelectedValue。在此操作之後,ComboBox.SelectedValue屬性實際上設置爲"Test Item 2",但它只是不顯示!另外我注意到,當我通過用戶界面上的用戶操作更改組合框中的選定值時,更改後的值顯示在組合框中,並且視圖模型屬性也會相應更新。因此除了最初的可視化模型屬性MySelectedValue以外,一切看起來都很好。我正變得非常絕望...

現在,雖然這是最簡單的例子,但在起源中,我想將整個實體綁定到ComboBox,設置DisplayMemberPathSelectedValuePath。不幸的是,同樣的問題發生。

+0

是你的工作? – 2012-07-14 09:48:33

+0

如果您從集合中獲取實際元素,而不是像'selectedValue = itemsSource [1]'中那樣將「新字符串」分配給selectedValue,問題是否會持續存在? – Patrick 2012-07-14 09:50:41

回答

29

我發現在我的例子問題:在XAML標記,我已經定義了SelectedValue財產之前ItemsSource屬性。如果我以這種方式交換兩個定義,它將起作用:

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

這真的很奇怪,很討厭。現在我想知道:這是一個錯誤還是設計?我認爲這是一個錯誤,因爲無論XAML中定義的屬性的順序如何,控件都應該工作。

+0

這是自Silverlight 2以來。 – 2012-12-05 23:41:48

+0

感謝您的提示。我一直在使用Silverlight/WPF/Windows8多年,從未注意到綁定事項的順序。最近我在開發Windows8應用程序時遇到了這個問題,我花了一段時間才意識到'SelectedValue'在'ItemsSource'綁定之前。 – 2013-01-14 20:31:00

+0

真的嗎?我不認爲這很重要 – 2013-02-05 17:02:32

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="[email protected]" }); 
      this.PersonCollection.Add(new Person { Name = "Jay", Email = "[email protected]" }); 
      this.PersonCollection.Add(new Person { Name = "Viral", Email = "[email protected]" }); 
     } 
    }