0

我目前正在编写基于标准 WPF Datagrid 的自定义控件。我已经实现了一个带有排序、分组和过滤等功能的工具栏。使用 ICollectionView 作为 ItemsSource 这些功能相当容易实现。

我的问题在于工具栏按钮应该触发的事件:我已经设法通过命令(SortClick、GroupClick、FilterClick)将 buttonclick 事件引发到我的视图代码隐藏(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 被定义为静态的(正如我在一些示例中看到的那样)。我将使用 RaiseEvent 来引发我的视图模型可以捕获的 RoutedEvent 是非静态的。

    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 回答