Как сделать общий шаблон с динамическим связыванием в WPF - PullRequest
0 голосов
/ 20 декабря 2018

Я создал различные элементы управления в WPF с соответствующими шаблонами элементов управления, в которых стилизация почти одинакова, но привязка отличается, как показано ниже, удаляя лишний беспорядок.Я ищу способ сделать общий ControlTemplate каким-то образом, чтобы связывание было динамическим.

ControlTemplate для элемента управления MasterRuleLayout

<ControlTemplate TargetType="{x:Type local:MasterRuleLayout}">
    <StackPanel>
        <Image  
            Style="{StaticResource MasterLayoutImageStyle}"
            DataContext="{Binding CommonAggregate.SelectedRule}">
        </Image>
        <TextBox
            Text="{Binding CommonAggregate.SelectedRule.Name}">
            <TextBox.Style>
                <Style TargetType="TextBox">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding CommonAggregate.SelectedRule.Parent}" 
                                     Value="{x:Null}">
                            <Setter Property="IsEnabled" Value="False" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </StackPanel>
</ControlTemplate>

ControlTemplate для элемента управления MasterEntityLayout

<ControlTemplate TargetType="{x:Type local:MasterEntityLayout}">
    <StackPanel>
        <Image  
            Style="{StaticResource MasterLayoutImageStyle}"
            DataContext="{Binding CommonAggregate.SelectedEntityItem}">
        </Image>
        <TextBox
            Text="{Binding CommonAggregate.SelectedEntityItem.Name}">               
        </TextBox>
    </StackPanel>
</ControlTemplate>

1 Ответ

0 голосов
/ 21 декабря 2018

Для привязок нужны свойства зависимостей, чтобы сформировать «склейку» между свойствами в привязках вашего шаблона и свойствами в моделях представления, с которыми вы связываетесь.Это означает, что у вас есть следующие варианты: 1) использовать TemplateBinding для привязки через существующие свойства в родительском шаблоне, 2) создать пользовательский элемент управления с отсутствующими дополнительными свойствами или 3) использовать присоединенные свойства:

<Window.Resources>
    <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type Control}">
        <TextBlock Text="{Binding Path=(local:AttachedProps.Name), Mode=OneWay,
            RelativeSource={RelativeSource TemplatedParent}}" />
    </ControlTemplate>
</Window.Resources>

<Control Template="{StaticResource MyTemplate}"
    local:AttachedProps.Name="{Binding MyViewModelName, Mode=OneWay}" />

Итогда вы бы сами создали прикрепленное свойство так:

public static class AttachedProps
{
    #region Name

    public static string GetName(DependencyObject obj)
    {
        return (string)obj.GetValue(NameProperty);
    }

    public static void SetName(DependencyObject obj, string value)
    {
        obj.SetValue(NameProperty, value);
    }

    public static readonly DependencyProperty NameProperty =
        DependencyProperty.RegisterAttached("Name", typeof(string),
        typeof(AttachedProps), new PropertyMetadata(String.Empty));

    #endregion Name
}
...