У меня есть две задачи, которые необходимо выполнить, когда установлен флажок. Этот флажок определен в 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 ».
Не уверен, что это правильный способ сделать это. Может кто-то указать мне в правильном направлении .. ?? Спасибо заранее.
Это решение не будет работать, поскольку этот флажок и текстовое поле являются частью CellTemplate файла данных, привязанного к коллекции. Именование флажка и текстового поля не решит проблему, так как оба этих элемента управления будут генерироваться динамически в зависимости от коллекции. – rajat