我创建了一个类来为DataGrid
保留一些额外的行为。我会简化它的真正功能,因为它现在并不重要。
当用户按下Up
或Down
个键时,它将执行DataGridHelper
类的私有本地方法;已经完成了。但是,当用户按下Right
或Left
时,我想从外部触发事件或Button
点击。当用户按左或右时,它将更改当前页面(重做搜索)。我想在许多PreviewKeyDown
中重复使用此DataGrid
。
我有一些想法,但我很困惑。我会创建另一个DependencyProperty
来传递Button id,所以我必须在Visual Tree中搜索,但我不知道这是否是最好的方法。我想做点什么:
<DataGrid x:name="myGrid"
Help:DataGridHelper.CustomGrid="True"
Help:DataGridHelper.OnLeftRight="myGrid_OnLeftRight" />
private void myGrid_OnLeftRight(object sender, CustomEventArgs e)
{
if(e.Key == "Left").....
}
这是我迄今为止所做的:
public class DataGridHelper
{
public static readonly DependencyProperty CustomGridProperty = DependencyProperty.RegisterAttached("CustomGrid", typeof(bool), typeof(DataGridHelper), new FrameworkPropertyMetadata(false, CustomGridCallback));
[AttachedPropertyBrowsableForType(typeof(DataGrid))]
public static bool GetCustomGrid(DependencyObject obj)
{
return (bool)obj.GetValue(CustomGridProperty);
}
[AttachedPropertyBrowsableForType(typeof(DataGrid))]
public static void SetCustomGrid(DependencyObject obj, bool value)
{
obj.SetValue(CustomGridProperty, value);
}
private static void CustomGridCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var dataGrid = (DataGrid)d;
if ((bool)e.NewValue == false)
{
dataGrid.PreviewKeyDown -= DataGrid_PreviewKeyDown;
}
else
{
dataGrid.PreviewKeyDown += DataGrid_PreviewKeyDown;
}
}
private static void DataGrid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key.Down || e.Key == Key.Up)
DoMyStuff(); // static method in DataGridHelper class
if(e.Key == Key.Left || e.Key == Key.Right)
// here I want to invoke a button click
// or here I want to invoke a passed method from view
}
}
我不想创建像MyDataGrid : DataGrid
这样的课程,因为我使用的是MahApps,有些风格不会起作用。
答案 0 :(得分:1)
这种做法是错误的。
在WPF中要记住的一个简单的一般规则:如果您在代码隐藏中使用事件来调用业务逻辑,那么您做错了。
您应该使用输入绑定或附加行为/混合SDK交互行为,通过将事件或特定按钮手势绑定到Commands
中的ViewModel
来获取所需的行为。
在某处的XAML中(例如DataGridTemplateColumn.CellTemplate
):
<i:Interaction.Triggers>
<i:EventTrigger EventName="LeftButtonUp">
<i:InvokeCommandAction Command={Binding LeftButtonActionCommand}/>
</i:EventTrigger>
<i:Interaction.Triggers>