iv'e 在我的启动项目中全局公开了一个 CompositeCommand
public static class Commands
{
public static readonly CompositeCommand DiceRolledCommand = new CompositeCommand();
}
在我的启动项目引用的 ControlLibrary 中,我得到了一个具有 DelegateCommand 的 Control,该 Control 的每个实例都必须使用全局公开的 DiceRolledCommand 注册它的 Command。
这样做的最佳做法是什么:
这里有 3 个想法,其中前 2 个我不喜欢,因为它们有点像 hack,你需要一些编程组件 (dp) 并为了你的利益改变它的用途,导致代码和设计不佳。
1) CompositeCommand 类型的常规颓废属性,将使用 DiceRolledCommand 设置,并在其 CallBack 注册 MyControl 的 DelegateCommand (OnDiceRolledCommand) 。
public class MyControl : Control
{
public DelegateCommand<Tuple<int, int>> OnDiceRolledCommand { get; private set; }
public CompositeCommand GlobalDiceRolledCommand
{
get { return (CompositeCommand)GetValue(GlobalDiceRolledCommandProperty); }
set { SetValue(GlobalDiceRolledCommandProperty, value); }
}
public static readonly DependencyProperty GlobalDiceRolledCommandProperty =
DependencyProperty.Register("GlobalDiceRolledCommand", typeof(CompositeCommand), typeof(MyControl), new UIPropertyMetadata(null,GlobalDiceRolledCommandPropertyChanged));
private static void GlobalDiceRolledCommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var myControl= d as MyControl ;
var compoisteCommand = e.NewValue as CompositeCommand;
compoisteCommand.RegisterCommand(myControl.OnDiceRolledCommand);
}
}
<local:MyControl GlobalDiceRolledCommand="{x:Static local:Commands.DiceRolledCommand}"/>
我不喜欢这种方法,因为它是一种使用依赖属性的操作,它有一个复杂的逻辑设置器。
2) 我也可以使用具有附加属性的第三方类执行与(1)中相同的操作,该附加属性将在附加属性的回调中注册 OnDiceRolledCommand
public static class Commands
{
public static readonly CompositeCommand DiceRolledCommand = new CompositeCommand();
public static ICommand GetRegisterToDiceRolledCommand(DependencyObject obj)
{
return (ICommand)obj.GetValue(RegisterToDiceRolledCommandProperty);
}
public static void SetRegisterToDiceRolledCommand(DependencyObject obj, ICommand value)
{
obj.SetValue(RegisterToDiceRolledCommandProperty, value);
}
public static readonly DependencyProperty RegisterToDiceRolledCommandProperty =
DependencyProperty.RegisterAttached("RegisterToDiceRolledCommand", typeof(ICommand), typeof(Commands), new UIPropertyMetadata(null,OnRegisterToDiceRolledCommandProperty);
private static void OnRegisterToDiceRolledCommandProperty(DependencyObject d , DependencyPropertyChangedEventArgs e)
{
var commandToRegister = e.newValue as DelegateCommand;
DiceRolledCommand.RegisterCommand(commandToRegister );
}
}
<local:MyContorl local:Commands.RegisterToDiceRolledCommand="{Binding OnDiceRolledCommand , RelativeSource={RelativeSource Self}}"/>
我也不喜欢这种方法,原因与 1 ..
3)将复合命令作为参数传递给构造函数,这种方法更好,因为它将初始化逻辑保留在构造函数中应该在的位置,我只是不知道如何通过 XAML 将参数传递给承包商,我'我不确定这是否可能。
public class MyControl : Control
{
public MyControl(CompositeCommand globalDiceRolledCommand)
{
.........
globalDiceRolledCommand.Register(OnDiceRolledCommand);
}
}
<local:MyControl ..... >
Some how pass parameters to contractor in order to create the element in XAML
</local:MyControl>
总结一下:
A) 关于 (1) 和 (2) 的任何想法。
B)关于如何完成 3 的想法,以及它是否看起来像好的设计。
C)完成这个场景的任何好的模式。
提前致谢 。