我正在使用WPF,MVVM和PRISM。 我在View中链接到ViewModel UC2002_RFPBeheren_ViewModel的数据窗口导致页面被包含的这个代码链接到另一个ViewModel,我希望Button有UC2002_RFPBeheren_ViewModel作为ViewModel。
此页面的datacontext是UC2002_RFPBeheren_ProjectInfo_ViewModel,但我希望SaveButton使用ViewModel UC2002_RFPBeheren_ViewModel
这是我的代码:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/RFPModuleResources.xaml" />
<ResourceDictionary>
<DataTemplate x:Key="SaveButton" DataType="{x:Type vm:UC2002_RFPBeheren_ViewModel}">
<Button Command="{Binding SaveRFPCommand}">Save</Button>
</DataTemplate>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
<ContentControl ContentTemplate="{StaticResource SaveButton}"/>
<Button Command="{Binding CloseTabCommand}">Close</Button>
</StackPanel>
尽管SaveButton显示但对我的命令没有反应。
我会忘记某些事情还是有其他办法解决这个问题?
在此先感谢;)!
=============================================== ==================================
修改
所以我做了一些改动,但它仍然不起作用。
代码示例:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/RFPModuleResources.xaml" />
<ResourceDictionary>
<DataTemplate x:Key="SaveButton" DataType="{x:Type vm:UC2002_RFPBeheren_ViewModel}">
<Button Command="{Binding SaveRFPCommand}">Save</Button>
</DataTemplate>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
我在页面的ViewModel中设置了这个属性
public UC2002_RFPBeheren_ViewModel MySaveVM { get; set; }
我的stackpanel现在看起来像这样:
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
<ContentControl Content="{Binding MySaveVM}" ContentTemplate="{StaticResource SaveButton}"/>
<Button Command="{Binding CloseTabCommand}">Close</Button>
</StackPanel>
答案 0 :(得分:3)
如果将UV2002_RFPBeheren_ViewModel实例设置为ContentPresenter的内容会怎样?
<ContentControl Content="{Binding MyUV2002_RFPBeheren_ViewModel}"/>
DataTemplate只是说明了应该如何显示Viewmodel,但是你必须将DataContext或Binding设置为viewmodel的实例。
编辑:
例如
public class VMFoo
{
public UV2002_RFPBeheren_ViewModel MySaveVM {get; set;}
}
xaml
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/RFPModuleResources.xaml" />
<ResourceDictionary>
<DataTemplate x:Key="SaveButton" DataType="{x:Type vm:UC2002_RFPBeheren_ViewModel}">
<Button Command="{Binding SaveRFPCommand}">Save</Button>
</DataTemplate>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
<x:local VMFoo/>
</UserControl.DataContext>
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
<ContentControl Content="{Binding MySaveVM}"/>
<Button Command="{Binding CloseTabCommand}">Close</Button>
</StackPanel>
编辑:小样本
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type WpfApplication1:UV2002_RFPBeheren_ViewModel}">
<Button Command="{Binding SaveRFPCommand}">Save</Button>
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.DataContext>
<WpfApplication1:VMFoo/>
</Grid.DataContext>
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
<ContentControl Content="{Binding MySaveVM}"/>
<Button Command="{Binding CloseTabCommand}">Close</Button>
</StackPanel>
</Grid>
</Window>
的ViewModels
public class VMFoo
{
public VMFoo()
{
this.MySaveVM = new UV2002_RFPBeheren_ViewModel();
}
public UV2002_RFPBeheren_ViewModel MySaveVM { get; set; }
}
public class UV2002_RFPBeheren_ViewModel
{
private DelegateCommand _save;
public ICommand SaveRFPCommand
{
get{if(this._save==null)
{
this._save = new DelegateCommand(()=>MessageBox.Show("success"),()=>true);
}
return this._save;
}
}
}
答案 1 :(得分:2)
这是因为ContentControl的工作方式。假设ContentTemplate中的内容与内容相关,因此DataContext设置为Content,因此即模板中的按钮可以访问的DataContext。您尚未指定Content,因此值为null,因此DataContext显式设置为null。您可以在一个基本示例中看到这一点。您可以做的一件事是将ContentControl的内容绑定到DataContext - 请参阅示例中的最后一个contentcontrol。
<StackPanel DataContext="Foo">
<StackPanel.Resources>
<DataTemplate x:Key="withBtn">
<Button Content="{Binding}" />
</DataTemplate>
</StackPanel.Resources>
<Button Content="{Binding}" />
<ContentControl ContentTemplate="{StaticResource withBtn}" />
<ContentControl Content="{Binding}" ContentTemplate="{StaticResource withBtn}" />
</StackPanel>
答案 2 :(得分:1)
如果您正在使用MVVM,则必须在UC2002_RFPBeheren_ProjectInfo_ViewModel中公开一些UC2002_RFPBeheren_ViewModel实例以进行绑定。作为属性,或作为属性的集合的项目。
视图中的所有内容必须最终可以从作为数据上下文的ViewModel访问(UC2002_RFPBeheren_ProjectInfo_ViewModel)