gpt4 book ai didi

WPF/MVVM 设计建议

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

我对 WPF 很陌生,我在这里寻找一些指导。

我正在开发一个应用程序,该应用程序将用于为我们的履行部门打印工作订单。

现在我有两个窗口:第一个是主屏幕,第二个是一个带有 GridView 的窗口,它将保存要打印的工作订单。

第一页将有几个按钮。每个按钮都会打开第二个窗口;但是,根据单击哪个按钮,传递给将加载数据的服务的参数会有所不同。

这样做的最佳实践方式是什么?

  • 有没有办法在 Button 控件的某处定义这些参数,然后通过 ICommand/RelayCommand 传递它们?
  • 我应该创建一个 UserControl/ServerControl 来让我构建这些附加属性吗?
  • 还有什么我没有想到的?

  • 编辑:

    举一个粗略的例子(这非常简单),假设我有 2 组标准:OrderTypes:{Rush,Today,Future} 和 Locations {Warehouse 1,Warehouse 2,Warehouse 3}

    主窗口将有一个 3x3 的按钮网格,每个组合一个。我希望能够在一个按钮上指定“Expedite & Warehouse 1”;然后将这些参数传递回单个方法,该方法将打开第二个窗口。

    最佳答案

    假设您有 MainWindow和按钮放置在其中。

  • 创建 MainWindowViewModel并将其设置为DataContext对于主窗口。
  • 有一个 ICommand在您的 ViewModel 上并使用此 ICommand 绑定(bind)按钮命令这样打开另一个窗口的入口点将是单一的。对于 ICommand,您可以使用 RelayCommandDelegateCommand哪个最适合你。
  • 现在,您需要打开窗口并根据按钮类型单击将参数传递给它。我建议让 Enum 描述需要根据不同按钮执行的操作。

  • 枚举
    public enum ActionType
    {
    Action1,
    Action2,
    Action3 and so on...
    }

    并像这样从按钮绑定(bind):
    <Button Command="{Binding CommandInstance}"
    CommandParameter="{x:Type local:ActionType.Action1}"/>

    <Button Command="{Binding CommandInstance}"
    CommandParameter="{x:Type local:ActionType.Action2}"/>

    其中 local 将是声明枚举的命名空间。

    并在命令中执行委托(delegate)将枚举值传递给另一个窗口构造函数:
    private void CommandMethod(ActionType action)
    {
    AnotherWindow anotherWindow = new AnotherWindow(action);
    anotherWindow.Show();
    }

    并且从构造函数中传递的操作中,您可以检查需要将哪些参数传递给负责加载数据的服务。

    此外,如果从 ViewModel 创建窗口看起来不正确,您可以在负责显示/关闭窗口的窗口控件上使用服务包装器。

    更新

    由于您想从 View 传递多个参数,因此为此维护枚举将很麻烦。您可以 使用 IMultiValueConverter 从 View 传递多个值 .

    让我用一个小例子来解释:
    <Button Command="{Binding TestCommand}">
    <Button.Resources>
    <sys:String x:Key="Rush">Rush</sys:String>
    <sys:String x:Key="Warehouse">Warehouse</sys:String>
    </Button.Resources>
    <Button.CommandParameter>
    <MultiBinding Converter="{StaticResource MultiValuesReturnConverter}">
    <Binding Source="{StaticResource Rush}"/>
    <Binding Source="{StaticResource Warehouse}"/>
    </MultiBinding>
    </Button.CommandParameter>
    </Button>

    在哪里 sys将是 XAML 中 System 的命名空间:
    xmlns:sys="clr-namespace:System;assembly=mscorlib"

    因此,现在您可以在 XAML 中自由地将许多对象从 XAML 传递到您的命令参数。您所要做的就是在 Button 资源部分下声明资源并将其作为绑定(bind)传递给转换器。

    转换器代码 将其转换为可以作为单个参数对象传递给命令的参数列表:
    public class MultiValuesReturnConverter : IMultiValueConverter
    {
    public object Convert(object[] values, Type targetType,
    object parameter, CultureInfo culture)
    {
    return values.ToList<object>();
    }

    public object[] ConvertBack(object value, Type[] targetTypes,
    object parameter, CultureInfo culture)
    {
    throw new System.NotImplementedException();
    }
    }

    命令方法:
    private void CommandMethod(object parameter)
    {
    // Now you have all the parameters here to take decision.
    IList<object> values = parameter as List<object>;

    AnotherWindow anotherWindow = new AnotherWindow(action);
    anotherWindow.Show();
    }

    关于WPF/MVVM 设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21679278/

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