WPF/MVVM 设计建议

标签 wpf mvvm

我对 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/

    相关文章:

    wpf - 具有圆形和降级背景的 StackPanel

    c# - 元素属性语法和属性属性语法在语义上有区别吗?

    WPF - 当绑定(bind)不在字符串中时附加绑定(bind)调试

    c# - 在接口(interface)中实现接口(interface)属性?

    javascript - Kendo UI MVVM 不明确的行为

    c# - 设置 AutoGenerateColumns=true 并按数据类型自动转换

    c# - 在 wpf 数据网格组合框列中显示一些静态值

    WPF ListView SelectedValue 未设置

    c# - 从另一个类库中的 ViewModel 关闭窗口

    ListBoxItem MVVM 命令绑定(bind)中的 WPF ListBox 命令