В WPF как получить команду в шаблоне управления для привязки к свойству в родительском элементе? - PullRequest
3 голосов
/ 20 мая 2010

Я относительно новичок в WPF, и иногда это заставляет мою голову взорваться.Тем не менее, мне нравится сила, стоящая за этим, особенно при использовании с моделью MVVM.

У меня есть ControlTemplate, который содержит Button.Я использую это ControlTemplate внутри пользовательского элемента управления.Я хочу добавить свойство в пользовательский элемент управления, которое будет привязано к свойству команды Button внутри ControlTemplate.По сути, это ComboBox с Button справа от него, чтобы пользователь мог открыть диалоговое окно поиска.Поскольку этот элемент управления может появляться в пользовательском элементе управления несколько раз, мне нужно иметь возможность потенциально привязывать каждый элемент управления к отдельной команде (продукты поиска, поиск клиентов и т. Д.).

Однако мне не удалось выяснить,как это сделать.

Вот пример XAML: </p> <p> </p> <pre><code><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 Ответ

1 голос
/ 20 мая 2010

Doh!

Это работает. Проблема заключалась в том, что мое свойство зависимости не использовало UIPropertyMetadata для метаданных свойства при регистрации свойства.

public ICommand ShowSearchCommand { get { return (ICommand)GetValue(ShowSearchCommandProperty); } set { SetValue(ShowSearchCommandProperty, value); } }</p> <pre><code> public static readonly DependencyProperty ShowSearchCommandProperty = DependencyProperty.Register("ShowSearchCommand", typeof(ICommand), typeof(SelectionFieldControl), new UIPropertyMetadata(OnShowSearchCommandChanged)); static void OnShowSearchCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { }

...