2

現在、アーティスト名が入力されたコンボ ボックスがあり、アーティストが選択されたら別のコンボ ボックスにバインドする必要があります。私の見解では、これらは次のように設定されています。

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

Selected Item イベントが 2 番目の Combo Box に入力されると想定していましたが、それは間違いでした。

4

3 に答える 3

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

List<> の代わりに ObservableCollection<> を使用することは良い回避策です。

于 2012-06-27T11:50:41.510 に答える
0

Selected Item イベントが 2 番目の Combo Box に入力されると想定していましたが、間違っていました

selecteditem イベントはありません。あなたが持っているのは SelectedItem Binding です。ビューをビューモデルのアクションに反応させたい場合は、INotifyPropertyChanged を発生させる必要があります。

だからあなたのinitialiseAlbums();の後 OnPropertyChanged("Albums"); を呼び出す必要があります。少なくとも。

ps:parentchildrelationobjects を作成することもできます。これにより、そのような作業がより簡単になります。

public class MyArtist
{
   public string Name{get;set;}
   public IList<Album> Albums {get;set}
}
于 2012-06-27T11:51:17.413 に答える
0

に変更しSelectedItem="{Binding SelectedArtist, Mode=TwoWay}"ます。

編集:プロパティ にゲッターを追加しSelectedArtistます。

于 2012-06-27T11:39:16.640 に答える