Привязка модели представления для просмотра в шаблоне данных - PullRequest
0 голосов
/ 10 февраля 2012
   public class ToolBarView : ToolBar
{
         public ToolBarView()
         {
            this.DataContext = new ToolBarViewModel();
         }
}


public ToolBarViewModel: ViewModelBase
    {
        public ObservableCollection<ViewModelBase> Items {get;set;} 
        public ToolBarViewModel()
        {
          // populate button view models 
         Items.Add(new ButtonViewModel() {Content="Button1"});
         Items.Add(new ButtonViewModel() {Content="Button2"});
         }
    }



 public class ButtonView : Button
    {
      public ButtonView()  
      {
          this.DataContext = new ButtonViewModel();
      }
    }



 public class ButtonViewModel : ViewModelBase
    {
      public object Content {get;set;}      
    }

В MainWindow.xaml

<Window.Resources>
    <DataTemplate x:Key="buttonTemplate" DataType="{x:Type vm:ButtonViewModel}">
       <v:ButtonView Content={Binding Content}/> 
     </DataTemplate>

<v:ToolBarView ItemsSource="{Binding Items}" 
               ItemTemplate={StaticResource buttonTemplate}/>

Примечание: я сделал INotifyChanged в классе ViewModelBase

В MainWindow.xaml. Я думаю, что мой шаблон неверен. ButtonView в DataTemplate создает новый экземпляр представления. Он не привязывает viewModel, который был размещен в коллекции элементов панели инструментов. Я пытался сделать с относительным связыванием. Все еще не успешно. Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 10 февраля 2012

Просто оставьте строку, в которой вы создаете новую виртуальную машину, и перезапишите DataContext:

this.DataContext = new ButtonViewModel();

Тогда DataContext будет унаследовано (это будет элемент в коллекции, ButtonVM).

(В качестве примечания вы, кажется, пытаетесь одновременно использовать view-first и view-model-first, вам следует придерживаться одного. Также представление, вероятно, должно уже связываться со всеми соответствующими свойствамина view-модели, так что вам просто нужно создать представление и все)

...