如何在DependencyProperty

时间:2016-11-11 14:58:13

标签: c# wpf

我创建了一个类来为DataGrid保留一些额外的行为。我会简化它的真正功能,因为它现在并不重要。

当用户按下UpDown个键时,它将执行DataGridHelper类的私有本地方法;已经完成了。但是,当用户按下RightLeft时,我想从外部触发事件或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,有些风格不会起作用。

1 个答案:

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