0

現在、標準の WPF Datagrid に基づいて Customcontrol を作成しています。並べ替え、グループ化、フィルタリングなどの機能を備えたツールバーを実装しました。ICollectionView を ItemsSource として使用すると、これらの関数を簡単に実装できます。

私の問題は、ツールバー ボタンが起動するイベントにあります。コマンド (SortClick、GroupClick、FilterClick) を介して、ビュー (MyDataGrid.cs) のコード ビハインドにボタンクリック イベントを発生させることができました。

                                    <ToolBarTray Orientation="Vertical" Grid.Row="1" Grid.Column="2" IsLocked="True">
                                        <ToolBar Band="1" BandIndex="1" >
                                            <Button Width="24" Height="24" ToolTip="Sort" Command="{x:Static local:PDataGrid.SortClick}">
                                                <Image Source="pack://application:,,,/PControls;component/Resources/sort.png" />
                                            </Button>
                                            <Button Width="24" Height="24" ToolTip="Filter" Command="{x:Static local:PDataGrid.GroupClick}">
                                                <Image Source="pack://application:,,,/PControls;component/Resources/filter.png" />
                                            </Button>
                                            <Button Width="24" Height="24" ToolTip="Group" Command="{x:Static local:PDataGrid.FilterClick}">
                                                <Image Source="pack://application:,,,/PControls;component/Resources/group.png" />
                                            </Button>
                                        </ToolBar>
                                    </ToolBarTray>

しかし、自分のコントロール (私の場合は MyDataGridView.cs) で動作するすべてのクラスがイベントを処理できるように、これらのイベントを自分のビューの外に出すにはどうすればよいでしょうか?

私の ICommands は static として定義されています (いくつかの例で見たように)。ビューモデルがキャッチできる RoutedEvent を発生させるために使用する RaiseEvent は静的ではありません。

    public static readonly RoutedEvent SortClickEvent = EventManager.RegisterRoutedEvent("SClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PDataGrid));

    public event RoutedEventHandler SClick
    {
        add { AddHandler(SortClickEvent, value); }
        remove { RemoveHandler(SortClickEvent, value); }
    }

    private void raiseSortClickEvent()
    {
        RoutedEventArgs e = new RoutedEventArgs(PDataGrid.SortClickEvent);
        RaiseEvent(e);
    }

    private static ICommand sortClick;
    public static ICommand SortClick
    {
        get
        {
            if (sortClick == null)
            {
                sortClick = new BaseCommand(sort);
            }

            return sortClick;
        }
        set { sortClick = value; }
    }

    private static void sort()
    {
        // sort() = static, therefore not working...
        //raiseSortClickEvent();
    }

助けてください - 多分私が現時点で見ることができないもっと簡単な解決策があります...


ああ、私はMVVMパターンの下で自分のコントロールを開発していて、それを使い続けたいと言うのを忘れていました. ロジック全体 (フィルター、グループ、並べ替え) はビューモデルにある必要があります。

編集:ああ、MVVMパターンでコントロールを開発していることを忘れていたので、それを使い続けたいと思います。ロジック全体 (フィルター、グループ、並べ替え) はビューモデルにある必要があります。

4

1 に答える 1

0

私は完全に理解していませんでした。ボタン コマンドを viewmodel にバインドし、viewmodel で魔法をかけるのを妨げているのは何ですか? (CollectionView の並べ替えなど)。通常、DataContext&viewmodel に対して直接バインドします。コードビハインドは関係ありません。

于 2012-07-22T18:36:57.310 に答える