2012-06-27 77 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} 
}