2015-11-24 4 views
0

Я пытаюсь использовать свойство IsChecked checkbox checkbox в DataTrigger. Основываясь на значении, я устанавливаю конкретный фон DataGridRow.WPF: Использование checkbox IsChecked свойство в DataTrigger

не мой рабочий код

<Style TargetType="{x:Type DataGridRow}"> 
       <Setter Property="Background" Value="LightGray" /> 
       <Setter Property="SnapsToDevicePixels" Value="true"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=chkbox, Path=IsChecked}" Value="true"> 
         <Setter Property="Background" Value="LightCyan" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 

<DataGrid x:Name="dataGrid1" AutoGenerateColumns="False"> 
       <DataGrid.Columns> 
        <DataGridTemplateColumn MinWidth="40" Width="Auto" Header="Select"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox x:Name="chkbox" IsChecked="{Binding Selected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></CheckBox> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 

        </DataGridTemplateColumn> 

      </DataGrid.Columns> 
    </DataGrid> 

Затем я проверил эту link и изменил код, как показано ниже, и она работает fine.Here Выбранный моя общественная собственность.

<Style TargetType="{x:Type DataGridRow}"> 
       <Setter Property="Background" Value="LightGray" /> 
       <Setter Property="SnapsToDevicePixels" Value="true"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Selected}" Value="true"> 
         <Setter Property="Background" Value="LightCyan" /> 
         </DataTrigger> 
       </Style.Triggers> 
      </Style> 

Пожалуйста, помогите мне понять, почему мой оригинальный код не работает? я что-то пропустил.
google не помогло. Удивительно, что на этом тоже нет нити! Спасибо вам за помощь.

ответ

2

Исходный код не работает, потому что вы пытаетесь найти объект с помощью ElementName, который существует в качестве шаблонного объекта, и, таким образом, не создан не до после связывания пытается решить. Как правило, вы должны использовать только ElementName при обращении к объектам-предкам в визуальном дереве, а не к детям, особенно с шаблонами.

Как уже упоминалось в комментариях, это также не представляется возможным использовать {RelativeSource FindAncestor... связывание здесь, потому что CheckBox ребенок, не предок, из DataGridRow

+0

в Можем ли мы использовать FindAncestor и AncestorLevel в эту привязку? – Marshal

+1

@NirajDoshi Я так не думаю, потому что CheckBox - это ребенок DataGridRow, а не предок. Я бы рекомендовал использовать значение привязки в вашем DataTrigger, как и в вашем втором блоке кода. – Rachel

+0

@ Рейчел: имеет смысл. Спасибо за разъяснения. – Marshal

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