2012-06-27 221 views
1

我目前有一個組合框,其中填充了藝術家名稱,我需要在選擇藝術家後將其綁定到另一個組合框。這些都是建立在我的觀點如下:基於另一個組合框的選定項目綁定組合框 - MVVM WPF

<ComboBox Height="23" HorizontalAlignment="Left" Margin="65,81,0,0" Name="comboBox1" ItemsSource="{Binding Artists}" SelectedItem="{Binding SelectedArtist}" VerticalAlignment="Top" Width="120" /> 
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="65,115,0,0" Name="comboBox2" VerticalAlignment="Top" ItemsSource="{Binding Albums}" SelectedItem="{Binding SelectedAlbums}" Width="120" /> 

在我的ViewModel我有以下幾點:

private void initialiseArtists() 
    { 
     MusicDataClassesDataContext dataClasses = new MusicDataClassesDataContext(); 

     artistList = (from m in dataClasses.tblArtists select m.ArtistName).ToList(); 
    } 

    public List<String> Artists 
    { 
     get 
     { 
      return this.artistList; 
     } 
    } 

    public string SelectedArtist 
    { 
     set 
     { 
      this.selectedArtist = value; 
      initialiseAlbums(); 
     } 
    } 

    private void initialiseAlbums() 
    { 
     if (selectedArtist != null) 
     { 
      MusicDataClassesDataContext dataClasses = new MusicDataClassesDataContext(); 

      var getArtist = dataClasses.tblArtists.FirstOrDefault(band => band.ArtistName == selectedArtist); 
      albumList = (from album in dataClasses.tblAlbums 
         where album.ArtistID == getArtist.ArtistID 
         select album.AlbumName).ToList(); 

      //dataClasses.tblAlbums.SelectMany(album => album.ArtistID == getArtist.ArtistID).ToList(); 
     } 
    } 

    public List<String> Albums 
    { 
     set 
     { 
      initialiseAlbums(); 
     } 
     get 
     { 
      return this.albumList; 
     } 
    } 

我假設所選項目事件將填充第二個組合框,但我錯了。

+0

2個或更多藝術家具有相同名稱時會發生什麼?你不需要ID? – blindmeis

+0

在進行'null'檢查之前,你在哪裏獲得'selectedArtist'的值? 當我嘗試'band.ArtistName == selectedArtist'時,我得到'null'。 – Eda

回答

3

您必須通知相冊屬性已更改的視圖。 這就是爲什麼你必須實現INotifyPropertyChanged接口並在構建相冊列表後調用PropertyChanged事件。

例如

public class Musics : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private void initialiseAlbums() 
    { 
     if (selectedArtist != null) 
     { 
      //Your code 
      OnPropertyChanged("Albums"); 
     } 
    } 
} 

其良好的解決方法使用的ObservableCollection <>而不是List <>。

+0

感謝您對Observable集合的建議。這是我成功實現的答案。 – framps

0

將其更改爲SelectedItem="{Binding SelectedArtist, Mode=TwoWay}"

編輯: 併爲SelectedArtist屬性添加吸氣劑。

+0

這不起作用,因爲他們仍然沒有出現。我是否還需要更改第二個組合框屬性中的任何內容? – framps

+0

@framps,你的輸出窗口中是否有綁定錯誤? – Zabavsky

+0

System.Windows.Data錯誤:17:無法從''(類型'ReadReviewsSelectViewModel')中獲取'SelectedArtist'值(鍵入'String')。 BindingExpression:路徑= SelectedArtist; DataItem ='ReadReviewsSelectViewModel'是我得到的錯誤 – framps

0

I was assuming that the Selected Item event would populate the second Combo Box but I was mistaken

沒有selecteditem事件。你有什麼是一個SelectedItem綁定。如果您希望視圖對視圖模型中的動作做出反應,則必須引發INotifyPropertyChanged。

所以在你initialiseAlbums();你必須打電話給OnPropertyChanged(「相冊」);至少。

ps:您還可以創建parentchildrelationobjects,使這些東西更容易。

public class MyArtist 
{ 
    public string Name{get;set;} 
    public IList<Album> Albums {get;set} 
}