在一个视图中设置不同的datacontext

时间:2014-04-04 08:50:19

标签: c# wpf xaml mvvm

我有2个Windows。从第一个窗口我打电话给第二个:

var window = new WindowButtonClick("Graphic") {DataContext = new GraphicViewModel()};
window.ShowDialog();

这是第二个窗口的XAML:

<Window x:Class="WindowButtonClick"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:graphic="clr-namespace:Windows.Graphic"
WindowStartupLocation="CenterScreen" >
<Window.Resources>
      <DataTemplate DataType="{x:Type graphic:GraphicViewModel}">
        <graphic:Graphic />
      </DataTemplate>
</Window.Resources>
<Grid>
    <ContentControl Content="{Binding}"/>
</Grid>

和构造函数:

public WindowButtonClicks(string title)
{
    InitializeComponent();
    Title = Application.Current.Resources[title].ToString();
}

那么如何设置DataContext,它将显示我在构造函数中传递的标题作为窗口标题和ContentControl将显示其中一个viewModel(在本例中为GraphicViewModel)

1 个答案:

答案 0 :(得分:0)

这是WPF中的常见问题。幸运的是,它有一个简单的解决方案。您需要使用RelativeSource Binding。因此,您需要将DataContext设置为一个对象,您可以将其数据绑定的属性简单地绑定为:

<TextBox Text="{Binding PropertyOfDataContext}" />

对于在WindowUserControl中声明的所有属性,您可以使用RelativeSource Binding,如下所示:

<TextBox Text="{Binding PropertyOfWindow, RelativeSource={RelativeSource AncestorType={
    x:Type YourXamlPrefix:YourWindow}}}" />

更新&gt;&gt;&gt;

你说:

  

我将有20个ViewModel,我想加载到ContentControl

如果您在提问时只提供了所有相关信息,那么您现在可以获得更好的答案。这是一个不同的问题,但可以很容易地修复。在这种情况下,您可以使用DataTemplate将视图模型设置为其视图...只需为每个视图模型/视图对定义一个,如下所示:

<DataTemplate DataType="{x:Type ViewModels:ViewModel1}">
    <Views:View1 />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:ViewModelN}">
    <Views:ViewN />
</DataTemplate>

请注意,我设置x:Key值...这意味着只要遇到相关类型的对象,框架就会隐式呈现指定的视图。然后,要显示此示例中的View1,您只需要执行此操作:

<ContentControl Content="{PropertyOfTypeViewModel1}" />

更新2&gt;&gt;&gt;

哇...我真的希望你这次能够正确解释你的问题,因为这是我的最后一次更新。所以我不能真正看到你要求的问题...你想在构造函数中设置一个属性来显示为Window.Title。这肯定有用:

public WindowButtonClicks(string title)
{
    InitializeComponent();
    Title = "Some Title";
}

因此,如果您的代码不起作用,那么您对Application.Current.Resources[title]的调用一定有问题...您是否实际检查过是否返回值?如果确实如此,那么你就会遇到一个真正的问题,因为像这样设置Window.Title是完全可以接受的。

如果Application.Current正在返回null,那么请确保在后面的代码中将其设置为MainWindow.xaml.cs的实例:

// In MainWindow.xaml.cs constructor
Application.Current = this;

除此之外,您无法根据所提供的信息确定问题。