Привязка к свойству зависимости пользовательского элемента управления - PullRequest
0 голосов
/ 29 декабря 2018

Краткий обзор

Я создал пользовательский элемент управления "InputValuePage".Я зарегистрировал свойство зависимости с этим элементом управления с именем InputTitle.Привязка внутри пользовательского элемента управления InputTitle к текстовому блоку прекрасно работает, однако я, когда использую этот пользовательский элемент управления в качестве дочернего элемента в рамке или окне, не могу использовать привязку для установки свойств зависимости.Ниже приведен код, используемый для свойства InputTitle.

Код класса пользовательского элемента управления:

public partial class InputValuePage : Page
{
public static readonly DependencyProperty InputTitleProperty  =
    DependencyProperty.Register("InputTitle", typeof(string), typeof(InputValuePage));

public string InputTitle
    {
        get { return (string)GetValue(InputTitleProperty); }
        set { SetValue(InputTitleProperty, value); }
    }

public InputValuePage()
    {
        InitializeComponent();
    }
}

Пример использования:

<Frame Grid.Row="2" 
           Grid.ColumnSpan="2"
           Grid.RowSpan="2"
           x:Name="DisFrame">
        <Frame.Content>
            <local:InputValuePage 
                                  InputMessage="This gets set in the control." 
                                  InputTitle="{Binding ElementName=DisFrame, Path=Name}" 
                                  HostWindow="{Binding ElementName=DemoWindow}">
            </local:InputValuePage>
        </Frame.Content>
    </Frame>

Для пояснения трех значений, установленных вXAML - все свойства зависимостей.Входное сообщение и заголовок могут успешно устанавливаться при наличии строки, однако привязки данных фактически никогда не устанавливают значение.Чего мне не хватает для привязки данных?

1 Ответ

0 голосов
/ 09 февраля 2019

Если вы делаете пользовательский элемент управления, это работает отлично.Пользовательский элемент управления наследуется от Control .Ваш класс унаследован от Page .

Я пробовал его со следующим кодом:

using System.Windows;
using System.Windows.Controls;

namespace WpfCustomControlLibrary1
{
  public class InputValuePage : Control
  {
    public static readonly DependencyProperty InputTitleProperty =
      DependencyProperty.Register ("InputTitle", typeof (string), typeof (InputValuePage));

    public string InputTitle
    {
      get { return (string)GetValue (InputTitleProperty); }
      set { SetValue (InputTitleProperty, value); }
    }

    static InputValuePage ( )
    {
      DefaultStyleKeyProperty.OverrideMetadata (typeof (InputValuePage), new FrameworkPropertyMetadata (typeof (InputValuePage)));
    }
  }
}

Это ControlTemplate в моем файле Generic.xaml.Обратите внимание, что вы можете использовать TemplateBinding для доступа к свойству в шаблоне.

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCustomControlLibrary1">
  <Style TargetType="{x:Type local:InputValuePage}">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type local:InputValuePage}">
          <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">

            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20" Text="{TemplateBinding InputTitle}"/>

          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</ResourceDictionary>

Visual Studio автоматически генерирует ControlTemplate при создании проекта настраиваемого элемента управления.

В моем тестовом проекте я подключилсвойство InputTitle вплоть до содержимого TextBox.

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        xmlns:cc="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1"
        Title="MainWindow" Height="200" Width="200">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
      <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <TextBox Grid.Row="0" x:Name="TitleBox" Text="ABC"/>

    <Frame Grid.Row="1" x:Name="DisFrame">
      <Frame.Content>
        <cc:InputValuePage InputTitle="{Binding ElementName=TitleBox, Path=Text}"/>
      </Frame.Content>
    </Frame>

  </Grid>
</Window>

Я вполне уверен, что это также будет работать с UserControl, если вам это будет проще.

Очевидно, что это делаетне работает со страницей.

...