我目前正在编写基于标准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中。
答案 0 :(得分:0)
我并不完全明白。什么阻止你将按钮命令绑定到viewmodel并在viewmodel中执行魔术? (如CollectionView排序等..)。通常直接绑定DataContext&amp; viewmodel。没有涉及代码。