我对 WPF 还很陌生,我在这里寻找一些指导。
我正在开发一个应用程序,该应用程序将用于为我们的履行部门打印工作订单。
现在我有两个窗口:第一个是主屏幕,第二个是一个带有网格 View 的窗口,用于保存要打印的工作订单。
第一页将有几个按钮。每个按钮都会打开第二个窗口;但是,根据单击的按钮,传递给将加载数据的服务的参数会有所不同。
这样做的最佳实践方法是什么?
编辑:
举一个粗略的例子(这太简单了),假设我有 2 组标准:OrderTypes: {Rush, Today, Future} 和 Locations {Warehouse 1, Warehouse 2, Warehouse 3}
主窗口将有一个 3x3 的按钮网格,每个组合一个。我希望能够在一个按钮上指定“加速和仓库 1”;然后将这些参数传递回单个方法,该方法将打开第二个窗口。
最佳答案
假设您有 MainWindow
并在其中放置了按钮。
MainWindowViewModel
并将其设置为 MainWindow 的 DataContext
。 ICommand
并使用此 ICommand
绑定(bind)按钮命令,以便打开另一个窗口的入口点将是单一的。对于 ICommand,您可以使用最适合您的 RelayCommand
或 DelegateCommand
。 枚举
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/