CustomControl之内置命令
在打造CustomControl时, 我们可能会遇到这样的情况: 希望模板中的Button能执行Control中某些特定的逻辑.
对于这种情况,有两种解决方法:TemplatePartAttribute和Command.
TemplatePartAttribute就是对UI中的元素命名, 然后在后台寻找此元素进行相应的操作. 很可惜, 这会使得UI与逻辑耦合, 这与CustomControl的初衷相悖.当外部程序改写Template时,很有可能失去作用.
而Command则十分可靠, 因为它能使UI和逻辑分离. 外部改写UI后, 只需对相应的元素重新绑定内置的Command就可以正常地工作. 下面为大家如何内置Command和如何进行绑定.
在下面的后台代码中, 对TestCommand进行声明和初始化. 然后在静态构造函数中通过CommandManager.RegisterClassCommandBinding(Type,CommandBinding)的方法进行类绑定(当然, 你也可以在构造函数中使用公共的CommandBindings集合,但这并不可靠,因为他人使用此控件时可以随意修改CommandBindings)
publicclassCustomControl1:Control{publicstaticreadonlyRoutedUICommandTestCommand;staticCustomControl1(){DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1),newFrameworkPropertyMetadata(typeof(CustomControl1)));TestCommand=newRoutedUICommand("Test","TestCommand",typeof(CustomControl1));CommandManager.RegisterClassCommandBinding(typeof(CustomControl1),newCommandBinding(TestCommand,TestExecute,TestCanExecute));}privatestaticvoidTestCanExecute(objectsender,CanExecuteRoutedEventArgse){CustomControl1c=senderasCustomControl1;if(c==null)return;e.CanExecute=c.CanExecute;}privatestaticvoidTestExecute(objectsender,ExecutedRoutedEventArgse){CustomControl1c=senderasCustomControl1;if(c==null)return;Console.WriteLine("---TestCommandExecuted---");}publicboolCanExecute;publicCustomControl1(){}}
接下来,看看Generic.xaml中的UI代码:
<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfCustomControlLibrary1"><StyleTargetType="{x:Typelocal:CustomControl1}"><SetterProperty="Template"><Setter.Value><ControlTemplateTargetType="{x:Typelocal:CustomControl1}"><BorderBackground="{TemplateBindingBackground}"BorderBrush="{TemplateBindingBorderBrush}"BorderThickness="{TemplateBindingBorderThickness}"><ButtonCommand="local:CustomControl1.TestCommand"Content="abc"/></Border></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary>
在上面代码的Button中, Command只需要这样就可以对内置的命令进行绑定.
以上就是在CustomControl中内置Command的方法.
PS: Button的Content不会自动绑定RoutedUICommand中的Text属性,可以将Content绑定Command.Text , 如下:Content="{Binding Path=Command.Text,RelativeSource={RelativeSource Self}}"
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。