Contentcontrol找不到我的数据模板它是ViewModel

时间:2011-10-27 13:15:10

标签: c# wpf xaml mvvm prism

我正在使用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>

3 个答案:

答案 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)