gpt4 book ai didi

wpf - 如何在 MVVM 之后为 WPF 构建通用/可重用模式对话框

转载 作者:行者123 更新时间:2023-12-04 01:50:13 24 4
gpt4 key购买 nike

我想构建一个通用/可重用的模式对话框,我可以在我们的 WPF (MVVM) - WCF LOB 应用程序中使用它。

我有一个希望使用对话框显示的 View 和关联的 View 模型。 Views 和 ViewModels 之间的绑定(bind)是使用以类型为目标的 DataTemplates 完成的。

以下是我能够起草的一些要求:

  • 我更喜欢它基于 Window 而不是使用像模态对话框一样的 Adorner 和控件。
  • 它应该从内容中获得其最小尺寸。
  • 它应该以所有者窗口为中心。
  • 窗口不得显示最小化和最大化按钮。
  • 它应该从内容中获得它的标题。

  • 做这个的最好方式是什么?

    最佳答案

    我通常通过将此接口(interface)注入(inject)适当的 ViewModel 来处理这个问题:

    public interface IWindow
    {
    void Close();

    IWindow CreateChild(object viewModel);

    void Show();

    bool? ShowDialog();
    }

    这允许 ViewModel 生成子窗口并在无模式下以模态方式显示它们。

    IWindow 的可重用实现是这样的:
    public class WindowAdapter : IWindow
    {
    private readonly Window wpfWindow;

    public WindowAdapter(Window wpfWindow)
    {
    if (wpfWindow == null)
    {
    throw new ArgumentNullException("window");
    }

    this.wpfWindow = wpfWindow;
    }

    #region IWindow Members

    public virtual void Close()
    {
    this.wpfWindow.Close();
    }

    public virtual IWindow CreateChild(object viewModel)
    {
    var cw = new ContentWindow();
    cw.Owner = this.wpfWindow;
    cw.DataContext = viewModel;
    WindowAdapter.ConfigureBehavior(cw);

    return new WindowAdapter(cw);
    }

    public virtual void Show()
    {
    this.wpfWindow.Show();
    }

    public virtual bool? ShowDialog()
    {
    return this.wpfWindow.ShowDialog();
    }

    #endregion

    protected Window WpfWindow
    {
    get { return this.wpfWindow; }
    }

    private static void ConfigureBehavior(ContentWindow cw)
    {
    cw.WindowStartupLocation = WindowStartupLocation.CenterOwner;
    cw.CommandBindings.Add(new CommandBinding(PresentationCommands.Accept, (sender, e) => cw.DialogResult = true));
    }
    }

    您可以将此窗口用作可重用的主机窗口。没有代码隐藏:
    <Window x:Class="Ploeh.Samples.ProductManagement.WpfClient.ContentWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:self="clr-namespace:Ploeh.Samples.ProductManagement.WpfClient"
    xmlns:pm="clr-namespace:Ploeh.Samples.ProductManagement.PresentationLogic.Wpf;assembly=Ploeh.Samples.ProductManagement.PresentationLogic.Wpf"
    Title="{Binding Path=Title}"
    Height="300"
    Width="300"
    MinHeight="300"
    MinWidth="300" >
    <Window.Resources>
    <DataTemplate DataType="{x:Type pm:ProductEditorViewModel}">
    <self:ProductEditorControl />
    </DataTemplate>
    </Window.Resources>
    <ContentControl Content="{Binding}" />
    </Window>

    您可以在 my book 中阅读更多相关信息(以及下载完整的代码示例)。 .

    关于wpf - 如何在 MVVM 之后为 WPF 构建通用/可重用模式对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2956027/

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