首页 > 解决方案 > wpf 从另一个 DataGridTextColumn 按名称查找元素

问题描述

我想与另一个“ DataGridTemplateColumn”按钮绑定,我尝试使用ElementName但它unset framework value在我的转换器中返回我。我想根据按钮启用状态更改行颜色,但这是一个嵌套了DataGrid.

<DataGridTextColumn Header="{x:Static loc:ManageRequirementsResource.lblName}" Binding="{Binding Name}" Width="0.5*" HeaderStyle="{StaticResource DataGridDefaultColumnHeaderStyle}"
                                                            ElementStyle="{StaticResource UcPredecessorSuccessorEnableDisableStyle}"/>
                                            <DataGridTextColumn Header="{x:Static loc:ManageRequirementsResource.lblDescription}" Binding="{Binding Description}" Width="*" 
                                                                HeaderStyle="{StaticResource DataGridColumnHeaderStyleWithoutRightBorder}">
                                                <DataGridTextColumn.ElementStyle>
                                                    <Style BasedOn="{StaticResource ToolTipWithContentTrimmedTextBlockStyle}" TargetType="{x:Type TextBlock}">
                                                        <Style.Resources>
                                                            <converters:MultiBindingPredecessorSuccessorIsEnabledConverter x:Key="MultiBindingPredecessorSuccessorIsEnabledConverter"/>
                                                        </Style.Resources>
                                                        <Style.Triggers>
                                                            <DataTrigger Value="False">
                                                                <DataTrigger.Binding>
                                                                    <MultiBinding Converter="{StaticResource MultiBindingPredecessorSuccessorIsEnabledConverter}">
                                                                        <Binding />
                                                                        <Binding ElementName="This" Path="ViewModel.SelectedRequirement"/>






 ##### Unable to find, UnSetValue, it's in another column
    <Binding ElementName="btnAddCommand"/> 

##### Unable to find, UnSetValue, it's in another column                                                                                
    <Binding ElementName="btnAddCommand" Path="IsEnabled"/> 



                                                               </MultiBinding>
                                                                </DataTrigger.Binding>
                                                                <DataTrigger.Setters>
                                                                    <Setter Property="Background" Value="{StaticResource GridHeaderBackgroundBrush}"/>
                                                                    <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                                                                </DataTrigger.Setters>
                                                            </DataTrigger>
                                                        </Style.Triggers>

                                                    </Style>
                                                </DataGridTextColumn.ElementStyle>

                                            </DataGridTextColumn>

                                        <DataGridTemplateColumn  HeaderStyle="{StaticResource DataGridColumnNoBorderHeaderStyle}">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <Button ToolTip="{x:Static reqPages:TraceabilityResource.linkToEditRequirementsTooltip}" Style="{StaticResource PopupMenueButtonStyle}" Click="LinkButton_OnClick" PreviewMouseLeftButtonUp="Button_OnMouseLeftButtonUp">
                                                        <Image Source="/Project;component/Resources/Images/link.png" Height="13" Width="13" />
                                                    </Button>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn  HeaderStyle="{StaticResource DataGridColumnNoBorderHeaderStyle}" x:Name="DataGridTemplateColumn">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                        <Grid>
                                                            <Grid.Style>
                                                                <Style TargetType="Grid">
                                                                    <Setter Property="Background" Value="White" />
                                                                    <Style.Triggers>
                                                                        <DataTrigger Binding="{Binding ElementName=btnAddCommand, Path=IsEnabled}" Value="False">
                                                                            <Setter Property="Background" Value="{StaticResource GridHeaderBackgroundBrush}" />
                                                                        </DataTrigger>
                                                                    </Style.Triggers>
                                                                </Style>
                                                            </Grid.Style>



**<!-- ######## I want to bind with this button ######-->**


                                                            <Button x:Name="btnAddCommand" ToolTipService.ShowOnDisabled="True" Command="{Binding ElementName=This, Path=ViewModel.AddingCommand}" CommandParameter="{Binding}" PreviewMouseLeftButtonUp="Button_OnMouseLeftButtonUp" Style="{StaticResource PopupMenueButtonStyle}">
                                                                <Image  Height="20" >
                                                                    <Image.Source>
                                                                        <MultiBinding Converter="{StaticResource MultiBindingPredecessorSuccessorImageSourceConverter}">
                                                                            <Binding/>
                                                                            <Binding ElementName="This" Path="ViewModel.SelectedRequirement"/>
                                                                            <Binding ElementName="btnAddCommand"/>
                                                                            <Binding RelativeSource="{RelativeSource self}" Path="IsEnabled"/>
                                                                        </MultiBinding>
                                                                    </Image.Source>
                                                                </Image>
                                                                <Button.ToolTip>
                                                                        <MultiBinding Converter="{StaticResource MultiBindingPredecessorSuccessorToolTipConverter}">
                                                                            <Binding/>
                                                                            <Binding ElementName="This" Path="ViewModel.SelectedRequirement"/>
                                                                            <Binding ElementName="btnAddCommand"/>
                                                                            <Binding ElementName="This" Path="ViewModel.IsSuccessor"/>
                                                                            <Binding RelativeSource="{RelativeSource self}" Path="IsEnabled"/>
                                                                        </MultiBinding>
                                                                </Button.ToolTip>
                                                            </Button>
                                                        </Grid>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                    </DataGrid.Columns>

标签: wpfdata-bindingdatagridnested

解决方案


您不能绑定到在另一列的模板中定义的元素。它们属于不同的名称范围。

您应该做的是将两列中元素的属性绑定到相同的源属性。

当您更改第一列元素的属性时,要更新第二列元素的属性(反之亦然),您的数据对象应实现INotifyPropertyChanged接口并为数据绑定源属性发出更改通知。


推荐阅读