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}/>
注意:我在ViewModelBase类中执行了INotifyChanged
在MainWindow.xaml中。我认为我的模板是错误的.DataTemplate中的BututView正在创建一个新的视图实例。它不绑定在ToolBar Items集合中弹出的viewModel。我尝试使用相对绑定。仍然没有成功。 请帮帮我。
答案 0 :(得分:1)
只需删除创建新VM的行并覆盖DataContext
:
this.DataContext = new ButtonViewModel();
然后DataContext
将被继承(它将是集合中的项目,ButtonVM)。
(作为旁注,你似乎首先尝试了view-first和view-model-first,你应该坚持使用一个。此外,视图应该已经绑定到视图上的所有相关属性 - 模型,这样你只需要创建视图就可以了。)