2017-02-18 6 views
1

ルーティングコマンドの仕組みを理解しようとしていますが、問題があります。 UserControlsをItemテンプレートとしたButtonとItemControlを持つメインウィンドウを作成しました。メインウィンドウでユーザーコントロールを使用してRoutedCommandを使用する

<Window> 
<Grid> 
<ItemsControl 
      ItemsSource="{Binding CollectionOfUsers}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <uc:UserUserControl 
         Name="{Binding PersonName}"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
<Button 
     Command="{x:Static helpers:RoutedCommands.SendChangesCommand}" 
     Content="SAVE"/> 
</Grid> 
</Window> 

メインウィンドウのボタンをクリックすると、ItemsControl内のすべてのUserControlからいくつかのメソッドを実行します。

私は静的クラスでRoutedCommandのを作成しました:

public static class RoutedCommands 
{ 
    public static readonly RoutedCommand SendChangesCommand = new RoutedCommand(); 
} 

そしてRoutedCommandのにユーザーコントロールを結合しました。コードビハインドの方法に

<UserControl.CommandBindings> 
    <CommandBinding Command="{x:Static helpers:RoutedCommands.SendChangesCommand}" 
        Executed="CommandBinding_Executed"/> 

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
     // Do something 
} 

は、私はボタンをクリックすると、それは、すべてのユーザーコントロールオブジェクトのメソッドを起動しますと思ったが、悲しいことに、このコードは動作しません - ボタンが無効になります。私は何が欠けていますか?

答えて

0

思考ボタンをクリックすると、すべてのユーザーコントロールオブジェクトのメソッドが呼び出されますが、残念ながらこのコードは機能しません。ボタンは無効です。私は何が欠けていますか?

RoutedCommand検索視標要素から木、この場合は、あなたのButtonあるコマンドを呼び出す要素、すなわち、 とそのCommandBindingsコレクションに一致するCommandBindingを目的としている要素のアップとこの特定のCommandBindingExecuteデリゲートを実行します。

ItemsControlUserControl要素はButtonのビジュアルペアレントではないため、コマンドは実行されません。

あなたが親GridCommandBindingを移動する場合は、Buttonが有効になります。

<Grid> 
    <Grid.CommandBindings> 
     <CommandBinding Command="{x:Static local:RoutedCommands.SendChangesCommand}" 
      Executed="CommandBinding_Executed"/> 
    </Grid.CommandBindings> 
    <ItemsControl 
    ... 

あなたが本当にButtonをクリックしたときにUserControlsで何かをしたい場合は、RoutedCommandを使用する方法ではありませんこれをする。

代わりにMVVM design patternを調べて、カスタムICommandを実装する方法、またはそこにある任意のMVVMライブラリの共通の実装を使用する方法があります。これは別の話ですが、簡単な紹介については、次のブログ記事を参照してください:https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/

MVVM XAMLベースのアプリケーションを構築する際に使用する推奨デザインパターンであり、深刻なWPF開発者はすべてそれを学習する必要があります。

0

ItemsControlのItemsSourceをButtonのCommandParameterとして送信し、それらのアイテム(モデル)で好きなことを行うことができます。適切なBindingsを使用すると、UserControls(View)で結果を確認できます。ここでは例:

public static class RoutedCommands 
{ 
    public static readonly RoutedCommand SendChangesCommand = new RoutedCommand(); 

    public static void CanExecuteSendChangesCommand(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 

    public static void ExecutedSendChangesCommand(object sender, ExecutedRoutedEventArgs e) 
    { 
     // Use e.Parameter; 
    } 
} 

とコマンドは、例えば、アプリケーション内CommandBindingsに追加されます:

public MainWindow() 
    { 
     InitializeComponent(); 
     CommandBindings.Add(new CommandBinding(RoutedCommands.SendChangesCommand,      RoutedCommands.ExecutedSendChangesCommand,RoutedCommands.CanExecuteSendChangesCommand)); 
    } 

[コマンドパラメータをバインドすることができます

が、これはRoutedCommandsであると仮定すると、

<DockPanel> 
    <Button DockPanel.Dock="Top" Content="Click Me" 
      Command="{x:Static local:RoutedCommands.SendChangesCommand}" 
      CommandParameter="{Binding ElementName=ic, Path=ItemsSource}"/> 
    <ItemsControl Name="ic" ItemsSource="{Binding CollectionOfUsers}"> 
     //... 
    </ItemsControl> 
</DockPanel> 
関連する問題