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

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

现在我有两个窗口:第一个是主屏幕,第二个是一个带有网格 View 的窗口,用于保存要打印的工作订单。

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

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

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

  • 编辑:

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

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

    最佳答案

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

  • 创建一个 MainWindowViewModel 并将其设置为 MainWindow 的 DataContext
  • 在您的 ViewModel 上有一个 ICommand 并使用此 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();
    }
    

    从构造函数中传递的 Action 中,您可以检查需要传递给负责加载数据的服务的参数。

    此外,如果从 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/

    10-13 01:58