基于另一个Combo Box的选定项目 - MVVM WPF绑定组合框

时间:2012-06-27 11:36:23

标签: c# wpf mvvm

我目前有一个组合框,其中填充了艺术家名称,我需要在选择艺术家后将其绑定到另一个。在我看来,这些设置如下:

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

我假设所选项目事件将填充第二个组合框,但我错了。

3 个答案:

答案 0 :(得分:3)

您必须通知视图Albums属性已更改。 这就是为什么你必须在构建你的专辑列表后实现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&lt;&gt;的好方法而不是列表&lt;&gt;。

答案 1 :(得分:0)

将其更改为SelectedItem="{Binding SelectedArtist, Mode=TwoWay}"

修改 并在SelectedArtist属性中添加一个getter。

答案 2 :(得分:0)

  

我假设Selected Item事件会填充第二个   组合框,但我错了

没有selectitem事件。你有什么是SelectedItem绑定。如果您希望视图对viewmodel中的操作做出反应,则必须提高INotifyPropertyChanged。

所以在你的initialiseAlbums()之后;你必须打电话给OnPropertyChanged(“专辑”);至少。

ps:你也可以创建parentchildrelationobjects,让这些东西更容易。

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