Привязка к ItemsSource не работает, пока визуальный элемент не проверен вручную (MVVM) - PullRequest
1 голос
/ 02 сентября 2010

У меня есть Xaml, который должен в основном связывать набор ContextualButtons для модели представления выбранной вкладки со свойством ItemsSource панели инструментов. По какой-то причине эта привязка на самом деле не происходит, если я не использую Snoop для проверки элемента вручную ... Кажется, что действие по отслеживанию элемента как-то требует привязки.

Кто-нибудь знает, что я тут не так делаю? Это поведение то же самое, если я использую Listbox, так что я знаю, что это то, что я делаю неправильно ... но я не уверен, что.

SelectedView - это свойство, привязанное к выбранному виду из элемента управления Xam Tab.

1007 * XAML * <ToolBar DataContext="{Binding SelectedView.ViewModel}" ItemsSource="{Binding ContextualButtons}" > <ToolBar.ItemTemplate> <DataTemplate> <!-- <Button ToolTip="{Binding Name}"--> <!-- Command="{Binding Command}">--> <!-- <Button.Content>--> <!-- <Image Width="32" Height="32" Source="{Binding ImageSource}"/>--> <!-- </Button.Content>--> <!-- </Button>--> <Button Content="{Binding Name}"/> </DataTemplate> </ToolBar.ItemTemplate> </ToolBar> Код

      public class TestViewModel : BaseViewModel, IBulkToolViewModel
      {


        public TestViewModel()
        {
          ContextualButtons = new ObservableCollection<IContextualButton>()
                                {
                                  new ContextualButton("Test Button",
                                                       new DelegateCommand<object>(
                                                         o_ => Trace.WriteLine("Called Test Button")), String.Empty)
                                };
        }

        public string Key { get; set; }
        private ObservableCollection<IContextualButton> _contextualButtons;
        public ObservableCollection<IContextualButton> ContextualButtons
        {
          get { return _contextualButtons; }
          set
          {
            if (_contextualButtons == value) return;
            _contextualButtons = value;
            //OnPropertyChanged("ContextualButtons");
          }
        }

      }

      public partial class TestView : UserControl, IBulkToolView
      {
        public TestView()
        {
          InitializeComponent();

        }


        public IBulkToolViewModel ViewModel { get; set; }

      }
      public class ContextualButton : IContextualButton
      {
        private string _name;
        public string Name
        {
          get { return _name; }
          set { _name = value; }
        }

        public ICommand Command { get; set; }
        public string ImageSource { get; set; }

        public ContextualButton(string name_, ICommand command_, string imageSource_)
        {
          Name = name_;
          Command = command_;
          ImageSource = imageSource_;
        }
      }

  public class BulkToolShellViewModel : BaseViewModel, IBaseToolShellViewModel, IViewModel 
  {

    private IBulkToolView _selectedView;
    public IBulkToolView SelectedView
    {
      get
      {
        return _selectedView;
      }
      set
      {
        if (_selectedView == value) return;
        _selectedView = value;
        OnPropertyChanged("SelectedView");

      }
    }
  public ObservableCollection<IBulkToolView> Views { get; set; }

    public DelegateCommand<object> AddViewCommand { get; private set; }
    public DelegateCommand<object> OpenPortfolioCommand { get; private set; }
    public DelegateCommand<object> SavePortfolioCommand { get; private set; }
    public DelegateCommand<object> GetHelpCommand { get; private set; }


    public BulkToolShellViewModel(ObservableCollection<IBulkToolView> views_)
      : this()
    {
      Views = views_;
    }

    public BulkToolShellViewModel()
    {
      Views = new ObservableCollection<IBulkToolView>();
      AddViewCommand = new DelegateCommand<object>(o_ => Views.Add(new TestView
                                                                     {
                                                                       ViewModel = new TestViewModel()
                                                                     }));
      OpenPortfolioCommand = new DelegateCommand<object>(OpenPortfolio);
      SavePortfolioCommand = new DelegateCommand<object>(SavePortfolio);
      GetHelpCommand = new DelegateCommand<object>(GetHelp);
    }

    private void GetHelp(object obj_)
    {

    }

    private void SavePortfolio(object obj_)
    {

    }

    private void OpenPortfolio(object obj_)
    {

    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged()
    {
      throw new NotImplementedException();
    }

    public void RaisePropertyChanged(string propertyName)
    {
      throw new NotImplementedException();
    }

    public string this[string columnName]
    {
      get { throw new NotImplementedException(); }
    }

    public string Error { get; private set; }
    public AsyncContext Async { get; private set; }
    public XmlLanguage Language { get; private set; }
    public string Key { get; set; }


  }

Спасибо!

1 Ответ

2 голосов
/ 02 сентября 2010

Почему BulkToolShellViewModel имеет свое собственное событие PropertyChanged вместе с RaisePropertyChanged методами, которые ничего не делают?Разве это не должно наследовать эту функциональность от BaseViewModel?Возможно, пользовательский интерфейс подключается к BulkToolShellViewModel.PropertyChanged, а не к BaseViewModel.PropertyChanged и никогда не уведомляется об изменениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...