我正在使用 Marlon Grech 的 AttachedCommandBehavior 库 ( https://marlongrech.wordpress.com/2008/12/04/attachedcommandbehavior-aka-acb/ ) 将命令绑定到我的 WPF 窗口事件。我让它成功地处理另一个用户控件,为几个文本框处理文本更改事件,并且效果很好。我现在正试图让它与组合框上的选择更改事件一起工作。我在 CommandBehaviorBinding.Execute() 中的 ExecutionStrategy 上收到空引用异常。我已经阅读了几篇关于使用 acb 的空引用异常绑定错误的帖子。我的输出中没有出现绑定错误,并且我已验证该命令已在视图模型中设置。这是我的一部分观点(为简洁起见,我删除了所有其他控件):
<ScrollViewer DockPanel.Dock="Top" >
<StackPanel Orientation="Vertical" >
<Expander Header="Contact Information">
<StackPanel Orientation="Vertical" >
<ItemsControl Style="{StaticResource ControlGrid}" Visibility="{Binding AddressType.Viewable, Converter={StaticResource Bool2Visible}}" IsTabStop="False">
<Label Grid.Column = "0" Content="{Binding AddressType.Title}" />
<ComboBox Grid.Column="1" x:Name="AddressType" VerticalAlignment="Center" SelectedValuePath="Tag" SelectedValue="{Binding AddressType.Value}"
acb:CommandBehavior.Event="SelectionChanged"
acb:CommandBehavior.Command="{Binding OnAddressTypeChangeCommand}"
acb:CommandBehavior.CommandParameter="SelectionChanged" >
<ComboBoxItem Tag="P" Content="Primary Address" />
<ComboBoxItem Tag="S" Content="Send To Address" />
<ComboBoxItem Tag="R" Content="Remittance Address" />
<ComboBoxItem Tag="M" Content="Marketing Address" />
<ComboBoxItem Tag="A" Content="Agent Address" />
</ComboBox>
</ItemsControl>
</StackPanel>
</Expander>
</StackPanel>
这是我设置命令的 ViewModel:
private void InitGroupData(LBBus500.ctGroup group)
{
// set the default Address Type
_addressType = ((char)LBBus500.ctListBillConstants.ADDRESS_USAGE_TYPES.ADDRTYPE_PRIMARY).ToString();
// Load reference tables
_countryList = GetCountryList();
_stateList = GetStateList();
// wire up view event commands
OnAddressTypeChangeCommand = new SimpleCommand { ExecuteDelegate = x => AddressTypeChangeCommand() };
}
//OnAddressTypeChange Command
public ICommand OnAddressTypeChangeCommand { get; private set; }
public void AddressTypeChangeCommand()
{
using (new LBControls.WaitCursor())
{
// Process the stuff.
// code here...
}
}
当我在组合框的数据绑定上设置断点时(即 SelectedValue="{Binding AddressType.Value}"),我可以看到 OnAddressTypeChangeCommand 已设置且不为空。数据上下文指向我的视图模型(我使用 Snoop 验证了这一点来查看可视化树)。绑定中遇到的数据正在工作,所以我觉得我已经正确设置了。
我愿意接受有关下一步看哪里的建议。我喜欢 acb,因为它的代码很简单,但我还没有接受它。到目前为止,我只在两个地方使用它,所以如果我必须更换它,不会有太多的胃灼热,尽管我还没有看到任何看起来很容易实现的东西。
提前致谢。
埃里克。