Перво-наперво: никогда не делай этого. XAML очень гибок и позволяет вам делать очень умные вещи, но только потому, что вы можете, не означает, что вы должны это делать. Правильным решением в этом случае является создание модели представления для каждого элемента строки с логическим свойством, с которым может быть связана кнопка и ваш триггер данных. Помимо большей гибкости, также гораздо проще тестировать, отлаживать, регистрировать и т. Д.
Тем не менее, то, что вы спрашиваете, технически возможно. DataGrids на самом деле довольно сложны из-за различных оптимизаций, которые они используют и т. Д., Поэтому вам все равно нужно использовать промежуточное свойство, но, поскольку вы не хотите использовать модель представления, вам придется использовать свойство Tag
в DataGridCell кнопки. вместо этого (который может использоваться для произвольных пользовательских данных):
- Свяжите свойство кнопки
IsChecked
, чтобы сделать одностороннюю привязку к источнику Tag
родительского свойства DataGridCell.
- Свяжите DataTrigger, чтобы найти родителя
DataGridCellsPanel
, а затем привяжите напрямую к свойству Tag
соответствующего дочернего элемента, т.е. Children[1].Tag
.
Соедините это, и вы получите это:
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header = "Filter ON" Width="SizeToCells" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.Style>
<Style TargetType = "ContentControl" >
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding = "{Binding Path=Children[1].Tag, RelativeSource={RelativeSource AncestorType={x:Type DataGridCellsPanel}}}" Value="True">
<Setter Property = "Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
<TextBlock Text="Content goes here" />
</ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn x:Name="F_column" Header ="Select">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ToggleButton x:Name="Filter_on" Content="Switch" IsChecked="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType=DataGridCell}, Mode=OneWayToSource}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
А если серьезно ... просто используйте модель представления.