0

ツールバー (追加および削除コマンド) と TabControl を備えたアプリケーションがあります。TabControl の各 tabItem に VariableGrid コントロールがあります。

画像を見てください:http://trueimages.ru/view/cNFyf

<DockPanel >
    <ToolBarTray DockPanel.Dock="Top">
        <ToolBar>
            <Button Command="{x:Static VariableGrid:VariableGrid.AddRowCommand}"/>
            <Button Content="Delete" Command="ApplicationCommands.Delete" />
        </ToolBar>
    </ToolBarTray>

    <TabControl x:Name="tc">
        <TabItem Header="Tab 1">
            <vg:VariableGrid ItemsSource="{Binding Items1, Mode=TwoWay}"/>            </TabItem>
        <TabItem Header="Tab 2">
            <vg:VariableGrid ItemsSource="{Binding Items2, Mode=TwoWay}"/>
        </TabItem>
    </TabControl>
<DockPanel >

ツールバー コマンドは、私のコントロールに実装されています。

public partial class VariableGrid : DataGrid, INotifyPropertyChanged 
{
    public static RoutedCommand AddRowCommand = new RoutedCommand();
    public VariableGrid()
    {
        this.CommandBindings.Add(new CommandBinding(VariableGrid.AddRowCommand, AddRow)); 
        this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Delete, R    emoveRow, CanRemoveRow)); 
    }

    private void AddRow(object sender, ExecutedRoutedEventArgs e)
    {
        …
    }
    private void RemoveRow(object sender, ExecutedRoutedEventArgs e)
    {
        …
    }

    private void CanRemoveRow(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = (SelectedItems.Count > 0);
    }
}

ツールバーのコマンドが無効になっているケースはほとんどありません:

  1. アプリケーションの実行時
  2. DataGrid の灰色のフィールドをクリックすると
  3. DataGrid が空の場合

DataGrid の任意の行が選択されると、ツールバーのコマンドがアクティブになります。

私の問題で私を助けてもらえますか? ツールバー ボタンのどの CommandTarget を設定すればよいですか?

PS: 私のアプリケーションには 2 つの VariableGrid があります。CommandTarget を "{Binding ElementName=variableGrid}" として設定できないのはそのためです。FocusedElement に設定する必要があると思います。しかし、これを行う方法がわかりません。

4

1 に答える 1

0

CanRemoveRow行を削除しても問題ないかどうかを確認するために、WPF は時々メソッドを呼び出す必要があります。その質問に答えるブール条件をこのメソッドに入れる必要があります。に同様の機能が必要な場合は、 をバインドするメソッドAddRowCommandを追加します。CanAddRowAddRowCommand

MSDNのCommanding Overviewを読むことをお勧めします

更新 >>>

ああ...これらの無効な条件に使用するコードを知りたいですか? 私はそう仮定します:

アプリケーションの実行時

「アプリケーションがビジー状態のとき」という意味だと思います... という名前のブール値プロパティを追加しIsBusy、アプリケーションが長時間実行されるプロセスを実行するときに true に設定してから!IsBusy、メソッド条件に追加します。

DataGrid の灰色のフィールドをクリックすると

DataGrid が空の場合

これらの条件は両方とも、メソッド条件に追加することにより、のSelectedItemプロパティを使用して判断できます。DataGrid&& dataGrid.SelectedItem != null

したがって、次のようなものが必要です。

private void CanRemoveRow(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = !IsBusy && SelectedItem != null);
}
于 2013-07-29T11:58:24.540 に答える