В WPF как получить команду в шаблоне управления для привязки к свойству в родительском элементе?
Я относительно новичок в WPF, и иногда это заставляет мою голову взорваться. Тем не менее, мне нравится мощь, особенно при использовании с моделью MVVM.
у меня есть ControlTemplate
который содержит Button
, Я использую это ControlTemplate
внутри пользовательского элемента управления. Я хочу добавить свойство в пользовательский элемент управления, который будет привязан к свойству команды Button
внутри ControlTemplate
, В основном это ComboBox
с Button
справа от него, чтобы пользователь мог открыть диалоговое окно поиска. Поскольку этот элемент управления может появляться в пользовательском элементе управления несколько раз, мне необходимо иметь возможность связать каждый элемент управления с другой командой (продукты поиска, поисковые клиенты и т. Д.).
Тем не менее, я не смог понять, как это сделать.
Вот пример 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>
Я думал, что смогу заставить его работать, сделав что-то вроде этого:
<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type SelectionFieldControl}}, Path=ShowSearchCommand}" Margin="2" />
Но это не работает.
Любая помощь будет принята с благодарностью.
1 ответ
Doh!
Это работает. Проблема заключалась в том, что мое свойство зависимости не использовало UIPropertyMetadata для метаданных свойства при регистрации свойства.
public ICommand ShowSearchCommand
{
get { return (ICommand)GetValue(ShowSearchCommandProperty); }
set { SetValue(ShowSearchCommandProperty, value); }
}
public static readonly DependencyProperty ShowSearchCommandProperty =
DependencyProperty.Register("ShowSearchCommand", typeof(ICommand),
typeof(SelectionFieldControl),
new UIPropertyMetadata(OnShowSearchCommandChanged));
static void OnShowSearchCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
}