1

WPF アプリケーションには、WrapPanel を使用して ItemsControl コンテナーを介してボタンとして表示している文字列のコレクションを公開している ViewModel があります。ただし、ViewModel の RelayCommand をボタンにバインドできませんでした。

ViewModel (IncidentAddressesViewModel):

public IEnumerable<string> Addresses { get; set; }

public RelayCommand<string> ZoomToAddressCommand { get {
  if (this.zoomToAddressCommand == null) this.zoomToAddressComamnd = new RelayCommand<string>(this.ZoomToAddress);
  return this.zoomToAddressCommand;
}}

private void ZoomToAddress(string address) { MessageBox.Show (address); }

XAML:

<TabItem x:Name="IncidentAddressesTab">
  <ItemsControl ItemsSource="{Binding Addresses}">
    <i:Interaction.Triggers>
      <i:EventTrigger EventName="Command">
        <cmd:EventToCommand 
          Command="{Binding ZoomToAddressCommand}"
          CommandParameter="{Binding Text}"
         PassEventArgsToCommand="True" 
        />
      </i:EventTrigger>
    </i:Interaction.Triggers>

    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <WrapPanel Orientation="Vertical"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <Button Content="{Binding}" />
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</TabItem>

DataContext を接続する Xaml コード ビハインド

IncidentAddressesTab.DataContext = new IncidentAddressesViewModel();

ボタンはアドレスとともに表示されています。ZoomToAddressCommand にブレークポイントを設定すると、1 回ヒットしますが、ボタンをクリックすると、ZoomToAddress メソッドが呼び出されません。

バインディングの詳細を含めるように更新: 実際に TabItem にバインドしています。XAML を更新して追加のタグを含め、XAML コード ビハインドにバインド コードを追加しました。これが適切な情報だとは知りませんでした。さもなければ、最初に追加していただろう.. (:

4

2 に答える 2

5

コントロールではなくにし​​ようとしBindCommandため、機能しません。これを試しましたか?:ItemsControlButton

<DataTemplate>
    <Button Content="{Binding}" Command="{Binding DataContext.ZoomToAddressCommand, 
        RelativeSource={RelativeSource AncestorType={x:Type 
        YourViewNamespace:YourViewName}}}" />
</DataTemplate>

ここでやろうとしていることは、現在のビューのとして設定されていると想定しているビュー モデルにBindから移行することです。" " を実際の XML 名前空間とビューの名前に置き換えてください。DataTemplateDataContextYourViewNamespace:YourViewName

更新 >>>

コードをもう一度見てみると、単にプロパティ名を使用しBindingてコレクションにアクセスしていることがわかります。AddressesあなたはDataContextが に設定されていると言うItemsControlので、ビューモデルが プロパティ に設定されていることを意味していると思いますItemsControl.DataContextBindingその場合は、次のCommandように変更する必要があります。

<DataTemplate>
    <Button Content="{Binding}" Command="{Binding DataContext.ZoomToAddressCommand, 
        RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
</DataTemplate>

ビューモデルがItemsControl.DataContextプロパティに設定されていない場合、これは機能せず、ビューモデルをビューにどのように接続したかを明確に伝える必要があります. DataContextあなたのビューモデルは、それを含むビューのにデータバインドされている、または通常行われていると思い込んでいた前にWindow...おそらく次回は、質問にこの情報を提供して、人々が回答しやすくすることができますか?

更新 2 >>>

わかりました、重要なDataContext情報で質問を更新しました...完璧です。これで、推測せずにあなたの質問に適切に答えることができます...最初にそれを追加していたら、これがどれほど簡単だったかがわかりますか? 関係ありません... 私たちは今ここにいます。この最後の例を試してください:

<DataTemplate>
    <Button Content="{Binding}" Command="{Binding DataContext.ZoomToAddressCommand, 
        RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" />
</DataTemplate>

繰り返しますが、これはコントロールRelativeSource Bindingが見つかるまでビジュアル ツリーを検索しTabItemます。次に、DataContextそのコントロールのプロパティを調べます。ZoomToAddressCommand最後に、オブジェクト (ビュー モデル) 内で ... として設定されているプロパティDataContextTabItem探します。

于 2013-09-18T13:40:35.970 に答える