C# 在WPF中,如何获取控件模板中的命令以绑定到父级中的属性?

C# 在WPF中,如何获取控件模板中的命令以绑定到父级中的属性?,c#,.net,wpf,controltemplate,commandbinding,C#,.net,Wpf,Controltemplate,Commandbinding,我对WPF比较陌生,有时它会让我头晕目眩。但是,我确实喜欢它背后的强大功能,尤其是与MVVM模型一起使用时 <Style TargetType="{x:Type m:SelectionFieldControl}"> <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" /> <Setter Property="Template"> &l

我对WPF比较陌生,有时它会让我头晕目眩。但是,我确实喜欢它背后的强大功能,尤其是与MVVM模型一起使用时

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
我有一个
控制模板
,其中包含一个
按钮
。我在自定义控件中使用
ControlTemplate
。我想在自定义控件上添加一个属性,该属性将绑定到
ControlTemplate
按钮的command属性。基本上,它是一个
组合框
,右侧有一个
按钮
,允许用户弹出搜索对话框。由于该控件可能会多次出现在usercontrol上,因此我需要能够将每个控件潜在地绑定到不同的命令(搜索产品、搜索客户等)

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
然而,我一直不知道如何做到这一点

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
下面是一些XAML示例:

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
我想我可以通过做这样的事情来实现它:

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type SelectionFieldControl}}, Path=ShowSearchCommand}" Margin="2" />

但它不起作用

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
任何帮助都将不胜感激。

Doh

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
这确实有效。问题是,我的依赖项属性在注册属性时没有将UIPropertyMetadata用于属性元数据

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

公共ICommand showsearch命令
{
获取{return(ICommand)GetValue(ShowSearchCommandProperty);}
set{SetValue(ShowSearchCommandProperty,value);}
}

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
    public static readonly DependencyProperty ShowSearchCommandProperty =
        DependencyProperty.Register("ShowSearchCommand", typeof(ICommand),
            typeof(SelectionFieldControl),
            new UIPropertyMetadata(OnShowSearchCommandChanged));

    static void OnShowSearchCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {

    }

<Style TargetType="{x:Type m:SelectionFieldControl}">
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                            Padding="{TemplateBinding Control.Padding}" 
                            BorderBrush="{TemplateBinding Border.BorderBrush}" 
                            Background="{TemplateBinding Panel.Background}" 
                            SnapsToDevicePixels="True"
                            Focusable="False">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" MinWidth="0" 
                                              SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="Auto" 
                                              SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                                                                        RelativeSource={RelativeSource FindAncestor, 
                                                                               AncestorType={x:Type m:BaseFieldControl}}}" />
                        </Grid.ColumnDefinitions>

                        <!-- Customized Value Part -->
                        <ComboBox x:Name="PART_Value" 
                                  Grid.Column="1"
                                  Margin="4,2,0,1" 
                                  SelectedValue="{Binding Path=SelectionField.Value, 
                                                          RelativeSource={RelativeSource FindAncestor, 
                                                                                         AncestorType={x:Type m:SelectionFieldControl}}}"

                                  IsEnabled="{Binding Field.IsNotReadOnly,
                                                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"
                                  Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible},
                                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}"

                                  FontFamily="{StaticResource FontFamily_Default}" FontSize="11px">
                            <ComboBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel IsVirtualizing="True" 
                                                            VirtualizationMode="Recycling"/>
                                </ItemsPanelTemplate>
                            </ComboBox.ItemsPanel>
                        </ComboBox>

                        <StackPanel Grid.Column="2" 
                                    Orientation="Horizontal" 
                                    Name="PART_Extra"
                                    Focusable="False">

                            <ContentControl Name="PART_LookupContent"
                                            Template="{Binding LookupTemplate, 
                                                               RelativeSource={RelativeSource FindAncestor, 
                                                                                              AncestorType={x:Type m:SelectionFieldControl}}}" 
                                            Focusable="False"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>