Marlon Grech の AttachedCommandBehavior ライブラリ ( https://marlongrech.wordpress.com/2008/12/04/attachedcommandbehavior-aka-acb/ ) を使用して、コマンドを WPF ウィンドウ イベントにバインドしています。いくつかのテキストボックスのテキスト変更イベントを処理する別のユーザーコントロールで正常に動作しており、うまく機能しています。私は今、コンボボックスの選択変更イベントで動作させようとしています。CommandBehaviorBinding.Execute() の ExecutionStrategy で null 参照例外が発生しています。acb を使用した null 参照例外バインディング エラーに関するいくつかの投稿を読みました。出力にバインディング エラーが表示されず、コマンドがビュー モデルに設定されていることを確認しました。これが私の見解の一部です (簡潔にするために他のすべてのコントロールを削除しました)。
<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 が設定され、null ではないことがわかります。データ コンテキストはビュー モデルを指しています (ビジュアル ツリーを確認するために Snoop を使用してこれを確認しました)。バインディングで渡されるデータは機能しているので、適切に設定されていると感じています。
次にどこを見るべきかについての提案をお待ちしています。コードがシンプルな acb が好きですが、まだ慣れていません。これまでのところ 2 か所でしか使用していないので、交換する必要がある場合でも胸やけはあまりしませんが、これほど簡単に実装できるものは見たことがありません。
前もって感謝します。
エリック。