WPF Customcontrol基于DataGrid +自定义事件

时间:2012-07-21 19:58:35

标签: wpf events datagrid custom-controls

我目前正在编写基于标准WPF Datagrid的Customcontrol。我已经实现了一个工具栏,其中包含一些功能,如排序,分组和过滤。使用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被定义为静态(正如我在一些例子中看到的那样)。 我将用于引发我的viewmodel可以捕获的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模式下的控件,并希望坚持下去。整个逻辑(过滤器,组,排序)应该在我的viewmodel中。

编辑: 哦,我忘了提到我正在开发MVVM模式下的控件,并希望坚持下去。整个逻辑(过滤器,组,排序)应该在我的viewmodel中。

1 个答案:

答案 0 :(得分:0)

我并不完全明白。什么阻止你将按钮命令绑定到viewmodel并在viewmodel中执行魔术? (如CollectionView排序等..)。通常直接绑定DataContext&amp; viewmodel。没有涉及代码。