2015-04-24 3 views
1

У меня есть две задачи, которые необходимо выполнить, когда установлен флажок. Этот флажок определен в DataGrid (который привязан к коллекции) в качестве шаблона данных DataGridTemplateColumn. Также есть DataGridTemplateColumn с шаблоном данных текстового поля. При проверке флажка я должен очистить текст текстового поля в той же строке, а также установить фокус на этом текстовом поле. Исправление текста отлично работает при использовании EventTrigger. Проблема - вторая часть, где я должен установить фокус на текстовое поле. Для достижения этой цели я думал использовать приложенное поведение с помощью ChangePropertyAction. Для этого я создал свойство зависимостей, надеясь получить ссылку на datagrid и найти текстовое поле, на котором нужно настроить фокус (что я буду делать позже).Фокусировка текстового поля в DataGrid при проверке события CheckBox

public class TestDependencyProperty : DependencyObject 
{ 
    public static readonly DependencyProperty 
     FlagCheckedProperty = 
     DependencyProperty.RegisterAttached(
       "FlagChecked", typeof(bool), typeof(TestDependencyProperty), 
     new PropertyMetadata(false, PropertyChangedCallback)); 

    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     var datagrid = dependencyObject as DataGrid; 
     //get the textbox from the datagrid on which focus 
     //has to set and set the focus 
    } 

    public static bool GetFlagChecked(
     DependencyObject d) 
    { 
     return (bool)d.GetValue(FlagCheckedProperty); 
    } 
    public static void SetFlagChecked(
     DependencyObject d, bool value) 
    { 
     d.SetValue(FlagCheckedProperty, value); 
    } 
} 

и вот XAML

<DataGrid ItemsSource="{Binding FlagCollection}" AutoGenerateColumns="False" CanUserAddRows="False" Margin="5" 
       VerticalScrollBarVisibility="Auto" v:TestDependencyProperty.FlagChecked="False"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="Non Kittable" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding Flag,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center"> 
          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="Checked"> 
            <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.FlaggedCheckedCommand}" 
                  CommandParameter="{Binding}"/> 
            <isc:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}" PropertyName="FlagChecked" Value="True"/> 
           </i:EventTrigger> 
          </i:Interaction.Triggers> 
         </CheckBox> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn Header="Tracking No." Width="2*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding XTrackingNum,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

Но, проверяя флажок, я получаю ошибку о том, «Не удается найти свойство с именем„v: TestDependencyProperty.FlagChecked“по типу„DataGrid“

Я также попытался привязать таким образом , но это не сработало - «Невозможно найти свойство с именем« FlagChecked »по типу« DataGrid ».

Не уверен, что это правильный способ сделать это. Может кто-то указать мне в правильном направлении .. ?? Спасибо заранее.

ответ

0

Наконец получил это работает, добавив булево свойство «FocusOnChecked» к классу коллекция которого становится переплетены в DataGrid и установки свойство как истинное или ложное на проверяемых и непроверяемых случае флажок с помощью ChangePropertyAction.

<i:Interaction.Triggers> 
          <i:EventTrigger EventName="Checked"> 
           <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.FlaggedCheckedCommand}" 
                 CommandParameter="{Binding}"/> 
           <isc:ChangePropertyAction TargetObject="{Binding}" PropertyName="FocusOnChecked" Value="True"/> 
          </i:EventTrigger> 
<i:EventTrigger EventName="Unchecked"> 
            <isc:ChangePropertyAction TargetObject="{Binding}" PropertyName="FocusOnChecked" Value="False"/> 
           </i:EventTrigger> 
         </i:Interaction.Triggers> 

Затем создано прикрепленное свойство для текстового поля и привязано к нему новым свойством.

public class FocusBehavior : DependencyObject 
{ 
    public static readonly DependencyProperty 
     FocusProperty = 
      DependencyProperty.RegisterAttached(
       "Focus", 
       typeof(bool), 
       typeof(FocusBehavior), 
       new FrameworkPropertyMetadata(false, PropertyChangedCallback)); 

    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     var txtBox = dependencyObject as TextBox; 
     if (txtBox == null) 
      return; 
     if (dependencyPropertyChangedEventArgs.NewValue is bool == false) 
      return; 
     if ((bool)dependencyPropertyChangedEventArgs.NewValue) 
      txtBox.Focus(); 
    } 

    public static bool GetFocus(
     DependencyObject d) 
    { 
     return (bool)d.GetValue(FocusProperty); 
    } 
    public static void SetFocus(
     DependencyObject d, bool value) 
    { 
     d.SetValue(FocusProperty, value); 
    } 
} 

ниже - xaml для текстового поля.

<DataTemplate> 
    <TextBox vm:FocusBehavior.Focus="{Binding Path= FocusOnChecked}" Text="{Binding TrackingNum,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" >  
    </TextBox> 
</DataTemplate> 
0

В xaml.cs вы установили фокус текстового поля. Установите флажок, если он установлен.

<CheckBox Name="sampleChkbox" Grid.Row="0" Grid.Column="0" Content="Flag" Checked="sampleChkbox_Checked"/> 
<TextBox Name="txtSample" Grid.Row="2" Width="200px" Height="40"/> 

    xaml.cs 
    private void sampleChkbox_Checked(object sender, RoutedEventArgs e) 
    { 
     CheckBox chk = sender as CheckBox; 
     if((bool)chk.IsChecked) 
      txtSample.Focus(); 
    } 
+0

Это решение не будет работать, поскольку этот флажок и текстовое поле являются частью CellTemplate файла данных, привязанного к коллекции. Именование флажка и текстового поля не решит проблему, так как оба этих элемента управления будут генерироваться динамически в зависимости от коллекции. – rajat