我有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)?
答案 0 :(得分:0)
这是WPF中的常见问题。幸运的是,它有一个简单的解决方案。您需要使用RelativeSource Binding
。因此,您需要将DataContext
设置为一个对象,您可以将其数据绑定的属性简单地绑定为:
<TextBox Text="{Binding PropertyOfDataContext}" />
对于在Window
或UserControl
中声明的所有属性,您可以使用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;
除此之外,您无法根据所提供的信息确定问题。