2015-07-10 62 views
0

我有类似下面的xaml。我无法将chkExtract复选框绑定到ChkHeaderExtract。我想为ChkHeaderExtract做一些事情,比如IsChecked =“{Binding ElementName = chkExtract”等等。但我无法访问chkExtract名称。此外,我无法从cs文件的任何位置访问chkExtract控件。任何人都可以帮助我如何做绑定。绑定到DataGrid中的DataTemplate中的元素

<DataGrid x:Name="DgEntities" FrozenColumnCount="13" IsReadOnly="True" MaxWidth="854" Height="444" CanUserAddRows="false" SelectedItem="{Binding GetSelectedRow,Mode=TwoWay,NotifyOnTargetUpdated=True}" ItemsSource="{Binding JobEntitiesCollectionViewSource.View, Mode=OneWay, NotifyOnTargetUpdated=True}" AutoGenerateColumns="False"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Binding="{Binding Name}" Header="Entity" Width="202" MaxWidth="202" MinWidth="202"/> 
        <DataGridTemplateColumn Header="Status" Width="138" MaxWidth="138" MinWidth="138"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <Button Margin="5" Content="{Binding ExtractStatus, Mode=TwoWay, NotifyOnTargetUpdated=True}" Command="{Binding DataContext.HyperlinkCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" CommandParameter="{Binding SelectedItem, ElementName=DgEntities}" Cursor="Hand" MouseDoubleClick="Control_OnMouseDoubleClick" > 
            <Button.Template> 
             <ControlTemplate TargetType="{x:Type Button}"> 
              <TextBlock Style="{StaticResource TxtblkStyleExtract}" TextDecorations="None"><InlineUIContainer> 
                <ContentPresenter /> 
               </InlineUIContainer></TextBlock> 
             </ControlTemplate> 
            </Button.Template> 
           </Button> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 

        <DataGridTemplateColumn Width="40" MaxWidth="40" MinWidth="40"> 
         <DataGridTemplateColumn.Header> 

          <CheckBox x:Name="ChkHeaderExtract" Width="26" Command="{Binding DataContext.HeaderExtractCommand,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}},Mode=OneWay}" CommandParameter="{Binding IsChecked,RelativeSource={RelativeSource Self}}" IsChecked="{Binding DataContext.ExtractHeaderCheck,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}},Mode=TwoWay}" /> 

         </DataGridTemplateColumn.Header> 

         <DataGridTemplateColumn.CellTemplate> 

          <DataTemplate> 

           <CheckBox x:Name="chkExtract" HorizontalAlignment="Center" VerticalAlignment="Center" Command="{Binding DataContext.IndividualExtractCommand,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}},Mode=OneWay}" CommandParameter="{Binding IsChecked,RelativeSource={RelativeSource Self}}" IsChecked="{Binding ExtractIsSelected, Mode=TwoWay, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}" /> 

          </DataTemplate> 

         </DataGridTemplateColumn.CellTemplate> 

        </DataGridTemplateColumn> 
</DataGrid.Columns> 
      </DataGrid> 

回答

0

问题是chkExtract是一个DataTemplate,这意味着它没有名字的知识,它外面的里面。

这也意味着的DataTemplate内命名的项目不能在cs文件(代码隐藏)

得到互相影响是通过视图模型的复选框,最好的办法中可以看出;将chkExtract.IsChecked绑定到网格使用的集合中的对象的属性,然后将标头的ChkHeaderExtract.IsChecked绑定到DataGrid的ViewModel上的属性。这样,您可以使用ViewModel中的C#代码来控制它们的交互。

+0

我通过视图模型做到了这一点,它一切正常。但在将来,如果遇到类似的情况,那么更改xaml或修改视图模型的最佳方法是什么?谢谢。 – nikhil

+0

当它是一个非常简单的绑定(即Textbox的可见性被绑定到Label的可见性)时,我更愿意直接在xaml中绑定项目,但每当它变得复杂时,我都会发现ViewModel更好,因为它可以更好地控制。至于复选框和类似的东西,我通常会把'IsChecked'绑定到ViewModel上的一个属性,因为这往往是你想要用于业务逻辑的信息。 – slimbofat

相关问题