gpt4 book ai didi

c# - 如何在Xaml中为使用mvvm代码创建的窗口添加样式?

转载 作者:行者123 更新时间:2023-12-03 10:44:36 25 4
gpt4 key购买 nike

该问题是针对此链接Opening new window in MVVM WPF的。

如果我有以下情况:

public class WindowService:IWindowService {
public void ShowWindow(object viewModel){
var win = new Window {Content = viewModel};
win.Show();
}
}

和我的app.xaml代码:
<DataTemplate DataType="{x:Type local:MyViewModel}">
<local:MyUserControlView />
</DataTemplate>

我不想在代码中添加样式,如下所示:
 public class WindowService:IWindowService {
public void ShowWindow(object viewModel){
var win = new Window {Content = viewModel};
win.SizeToContent = SizeToContent.WidthAndHeight;
win.ResizeMode = ResizeMode.NoResize;
win.WindowStartupLocation = WindowStartupLocation.CenterScreen;
win.Icon =...
win.Show();
}
}

有没有办法在Xaml中使用dataTemplate做到这一点?

我想要一种方法,能够在xaml中而不是在代码中更改在WindowService中创建的窗口的样式。不是全局样式,但是例如,如果我有viewModel1和viewModel2,则showWindow将能够根据传递给它的viewModel创建两个具有不同样式的窗口

最佳答案

为此,您可以使用Windows ContentTemplateSelector属性。首先创建一个新的DataTemplateSelector类。此类的目的是根据传入的ViewModel的类型来标识要使用的数据模板。在SelectTemplate方法中,有一个参数对象项。在那里,您可以获取窗口的内容,在您所拥有的服务中,您将在其中将 View 模型传递给窗口的内容。因此,您将能够从该对象参数获取 View 模型。

 public class WindowTemplateSelector : DataTemplateSelector
{
public DataTemplate ViewModelTemplate1 { get; set; }
public DataTemplate ViewModelTemplate2 { get; set; }

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is ViewModel1)
return ViewModelTemplate1;
else
return ViewModelTemplate2;
}
}

然后在Application.Resources中添加两个数据模板和一个模板选择器实例。您可以在 local:WindowTemplateSelector中看到,我们指定了 ViewModelTemplate1ViewModelTemplate2的数据模板。
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
StartupUri="MainWindow.xaml">
<Application.Resources>
<DataTemplate x:Key="Template1">
<Grid>
<TextBlock Text="Hello World" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="Template2">
<Grid>
<TextBox Text="Hello World" />
</Grid>
</DataTemplate>
<local:WindowTemplateSelector x:Key="windowTemplateSelector"
ViewModelTemplate1="{StaticResource Template1}"
ViewModelTemplate2="{StaticResource Template2}"/>
</Application.Resources>
</Application>

然后,您需要将模板选择器传递给服务。
public class WindowService:IWindowService {
public void ShowWindow(object viewModel, DataTemplateSelector templateSelector){
var win = new Window {Content = viewModel};
win.ContentTemplateSelector = templateSelector;
win.Show();
}
}

有了这个,您可以为窗口的不同 View 模型拥有多个模板。

关于c# - 如何在Xaml中为使用mvvm代码创建的窗口添加样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32379282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com