none
Вложенный биндинг MVVM WPF RRS feed

  • Вопрос

  • Имеется:
    public class MainViewModel : PlayerViewModel
        {...}
    public class PlayerViewModel : ViewModelBase
    {
            private PlaylistManagerViewModel _plistManagerViewModel;
            public PlaylistManagerViewModel PlistManagerViewModel
            {
                get { return _plistManagerViewModel; }
            }
    ...
    }
    private PlaylistsManager _plistManager;
            
            ObservableCollection<PlaylistViewModel> _playlistViewModels=new ObservableCollection<PlaylistViewModel>();
    
            internal ObservableCollection<PlaylistViewModel> PlaylistViewModels
            {
                get { return _playlistViewModels; }
                set { _playlistViewModels = value; }
            }
            
            public PlaylistViewModel CurrentPlist
            {
                get
                {
                    try
                    {
                        return _playlistViewModels[IndexOfCurrentPlaylist];
                    }
                    catch
                    {
                        return new PlaylistViewModel();
                    }
                }
            }
            public int IndexOfCurrentPlaylist
            {
                get { return _plistManager.IndexOfCurrentPlaylist; }
                set
                {
                    if(_plistManager.IndexOfCurrentPlaylist!=value)
                    {
                        _plistManager.IndexOfCurrentPlaylist = value;
                        RaisePropertyChanged("IndexOfCurrentPlaylist");
                        RaisePropertyChanged("CurrentPlist");
                    }
                }
           }
    ...
    }
    public class PlaylistViewModel : ViewModelBase
        {
            public BaseSong CurrentSong
            {
                get
                {
                    return Collection.ElementAt<BaseSong>(CurrentSongIndex);
                }
            }
            public string Title
            {
                get
                {
                    try
                    {
                        return CurrentSong.FullName;
                    }
                    catch { return null; }
                }
            }
            public CollectionSong<BaseSong> Collection
            {
                get { return _plist.Collection; }
                 set
                {
                    _plist.Collection = value;
                    PlistIsLoading = false;
                    if (value != null) 
                        CurrentSongIndex = 0;
                    RaisePropertyChanged("Collection");               
                }
            }
            public int CurrentSongIndex
            {
                get { return _plist.CurrentSongIndex; }
                set
                {
                    if (_plist.CurrentSongIndex != value)
                    {
                        _plist.CurrentSongIndex = value;
                        RaisePropertyChanged("CurrentSong");
                        RaisePropertyChanged("SourceUri");
                        RaisePropertyChanged("Title");
                    }
                }
            }
            public Uri SourceUri
            {
                get
                {
                    try
                    {
                        var url = CurrentSong.Url;
                              ...
                        return url;
                    }
                    catch { return null; }
                }
            }
    ...
    }


    DataContext естественно установлен в MainWindowView.

    Проблема собственно с биндингом: PlistManagerViewModel.CurrentPlist.SourceUri и PlistManagerViewModel.CurrentPlist.Title. Единственный способ заставить работать - это добавить св-во в MainViewModel
    MediaElement для SourceUri и выполнить биндинг конкретным способом:

    _MediaElement.SetBinding(MediaElement.SourceProperty, new Binding("CurrentPlist.SourceUri")

    {   

    Source = PlistManagerViewModel

    }



    Иначе никак не выходит.
    Если сделать тоже самое в MainWindowView.cs работать корректно не будет.
     в ХAML не находит свойств, выбрасывает ошибку в выводе.
    Как быть? Использовать подписку на RaisePropertyChanged по дереву, оставить так? Тогда на каждый UIElement хранить ссылку в MainViewModel, что не есть гуд.

    Т.е. нужен правильный биндинг, формально забиндить:
    const obj.Array a[i].Array b[j].Property
    29 августа 2014 г. 3:52

Ответы

  • Добрый день.

    А что Binding вот такого вида:

    "{Binding PlistManagerViewModel.CurrentPlist.SourceUri}"
    
    

    не работает?
    • Помечено в качестве ответа Egoist42 29 августа 2014 г. 19:52
    29 августа 2014 г. 12:50
    Отвечающий

Все ответы