1

我正在使用 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,因为它的代码很简单,但我还没有接受它。到目前为止,我只在两个地方使用它,所以如果我必须更换它,不会有太多的胃灼热,尽管我还没有看到任何看起来很容易实现的东西。

提前致谢。

埃里克。

4

1 回答 1

0

我决定稍微改变一下。我正在使用 Prism,这对于我需要的东西来说有点矫枉过正。我更改为 MVVM light 并使用框架中的 EventToCommand 模型。我的组合框现在看起来像这样:

我将我的命令更改为 RelayCommands,它现在可以工作了。

于 2015-05-05T21:21:55.463 回答