use*_*522 5 wpf commandbinding
我在理解命令参数绑定如何工作方面遇到了一些麻烦.
当我在调用InitializeComponent之前创建一个widget类的实例时,它似乎工作正常.对ExecuteCommand函数中的参数(Widget)的修改将"应用"到_widget.这是我预期的行为.
如果在InitializeComponent之后创建了_widget的实例,我会在ExecuteCommand函数中获得e.Parameter的空引用异常.
为什么是这样?如何使用MVP模式进行此工作,在创建视图后可以创建绑定对象?
public partial class WidgetView : Window
{
RoutedCommand _doSomethingCommand = new RoutedCommand();
Widget _widget;
public WidgetView()
{
_widget = new Widget();
InitializeComponent();
this.CommandBindings.Add(new CommandBinding(DoSomethingCommand, ExecuteCommand, CanExecuteCommand));
}
public Widget TestWidget
{
get { return _widget; }
set { _widget = value; }
}
public RoutedCommand DoSomethingCommand
{
get { return _doSomethingCommand; }
}
private static void CanExecuteCommand(object sender, CanExecuteRoutedEventArgs e)
{
if (e.Parameter == null)
e.CanExecute = true;
else
{
e.CanExecute = ((Widget)e.Parameter).Count < 2;
}
}
private static void ExecuteCommand(object sender, ExecutedRoutedEventArgs e)
{
((Widget)e.Parameter).DoSomething();
}
}
<Window x:Class="CommandParameterTest.WidgetView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WidgetView" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<StackPanel>
<Button Name="_Button" Command="{Binding DoSomethingCommand}"
CommandParameter="{Binding TestWidget}">Do Something</Button>
</StackPanel>
</Window>
public class Widget
{
public int Count = 0;
public void DoSomething()
{
Count++;
}
}
Run Code Online (Sandbox Code Playgroud)
InitializeCompenent 处理与该文件关联的 xaml。正是在这个时间点,首先处理 CommandParameter 绑定。如果您在 InitializeCompenent 之前初始化字段,那么您的属性将不为 null。如果您在之后创建它,则它为空。
如果您想在 InitializeCompenent 之后创建小部件,那么您将需要使用依赖属性。依赖属性将引发一个通知,导致 CommandParameter 被更新,因此它不会为空。
以下是如何使 TestWidget 成为依赖属性的示例。
public static readonly DependencyProperty TestWidgetProperty =
DependencyProperty.Register("TestWidget", typeof(Widget), typeof(Window1), new UIPropertyMetadata(null));
public Widget TestWidget
{
get { return (Widget) GetValue(TestWidgetProperty); }
set { SetValue(TestWidgetProperty, value); }
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13321 次 |
最近记录: |