基于另一个组合框的选择项绑定组合框 - MVVM WPF(Bind Combo Box based

2019-09-18 14:38发布

我现在有这填充了艺术家名称的组合框,我需要一次选择的艺术家将其绑定到另一个。 这些都是建立在我的观点如下:

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

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

Answer 1:

你必须通知该相册属性改变了看法。 这就是为什么你必须实现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。



Answer 2:

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

没有将selectedItem事件。 你有什么是绑定的SelectedItem。 如果你希望你的观点,以应对在您的视图模型的动作,你必须提高INotifyPropertyChanged的。

所以你initialiseAlbums后(); 你必须调用OnPropertyChanged(“相册”); 至少。

PS:您还可以创建parentchildrelationobjects,使得这样的东西更容易。

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


Answer 3:

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

编辑:还有一个getter添加到SelectedArtist财产。



文章来源: Bind Combo Box based on another Combo Box's selected item - MVVM WPF
标签: c# wpf mvvm