2013-08-19 4 views
1

Я пытаюсь создать стиль, который заставит все мои DataGrids выбрать строку -1, когда они потеряют фокус. Я делаю:ToolKit DataGrid отменить выбор на LostFocus

<Style TargetType="{x:Type DataGrid}"> 
    <Style.Triggers> 
     <EventTrigger RoutedEvent="DataGrid.LostFocus"> 
      <BeginStoryboard> 
       <Storyboard> 
        <Int32AnimationUsingKeyFrames Storyboard.TargetProperty="(DataGrid.SelectedIndex)"> 
         <DiscreteInt32KeyFrame KeyTime="00:00:00" Value="-1" /> 
        </Int32AnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
</Style> 

Он работает только в первый раз фокус теряется, но на второй раз аварийное завершение работы программы из-за преобразования ecxeption типа. Возможно ли это без кода?

+0

Вы просто пытаетесь удалить выбранный элемент из 'DataGrid'? – Sheridan

+0

Я пытаюсь удалить выделение (ничего не выбрать). – Taras

+0

Возможно, стоит переименовать ваше сообщение, чтобы указать свою * актуальную * цель. – Sheridan

ответ

2

Согласно моим исследованиям, прикрепленная поведение является единственным приемлемым решением для меня. Надеюсь, это поможет кто-то еще:

public class DataGridBehavior 
{ 
    public static readonly DependencyProperty IsDeselectOnLostFocusProperty = 
    DependencyProperty.RegisterAttached("IsDeselectOnLostFocus", typeof(bool), typeof(DataGridBehavior), new UIPropertyMetadata(false, PropertyChangedCallback)); 

    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
    { 
     var dg = dependencyObject as DataGrid; 
     if (dg == null) 
      return; 

     if (e.NewValue is bool == false) 
      return; 

     if ((bool)e.NewValue) 
      dg.LostFocus += dg_LostFocus; 
    } 

    static void dg_LostFocus(object sender, RoutedEventArgs e) 
    { 
     (sender as DataGrid).SelectedIndex = -1; 
    } 

    public static bool GetIsDeselectOnLostFocus(DataGrid dg) 
    { 
     return(bool)dg.GetValue(IsDeselectOnLostFocusProperty); 
    } 

    public static void SetIsDeselectOnLostFocus(DataGrid dg, bool value) 
    { 
     dg.SetValue(IsDeselectOnLostFocusProperty, value); 
    } 
} 

Тогда:

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="helpers:DataGridBehavior.IsDeselectOnLostFocus" Value="True"/> 
</Style> 
0

Лучший способ достичь своей фактической цели де-выбор выделенного элемента, чтобы связать объект того же типа, как и в данных для сбора связанных с DataGrid.ItemsSource имущества в DataGrid.SelectedItem собственности. Если вы хотите, чтобы отменить выбранный элемент, вы просто установите этот объект null:

<DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding Item}" /> 

В модели представления:

Item = null; // de-selects the selected item 
+0

Спасибо, это понятно, но я просто хотел, чтобы стиль достиг такого поведения во всех моих DataGrids .. И что мне делать onLostFocus ..? Перейти к VM? Использовать System.Windows.Interactivity для запуска команд по событиям ..? Это слишком сложно .. imho – Taras

 Смежные вопросы

  • Нет связанных вопросов^_^