绑定到自定义控件的依赖项属性

时间:2018-12-29 00:52:26

标签: c# wpf custom-controls dependency-properties

快速概述

我已经创建了一个自定义控件“ 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 :(得分:0)

如果您进行自定义控件,则效果很好。自定义控件继承自 Control 。您的课程继承自 Page

我用以下代码尝试过:

awk '
  NR == FNR {
  a[$1] = $2
  next
}
{
  for ( i = 1 ; i <= NF ; i++ ) {
  b = $i
  gsub ( "^{|}$" , "" , b )
  if ( b in a )
    sub ( "{" b "}" , a[b] , $i )
 }
} 1' FS='=' param1.txt FS=" " source1.txt

这是我的Generic.xaml文件中的ControlTemplate。请注意,您可以使用TemplateBinding访问模板中的属性。

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)));
    }
  }
}

在创建自定义控件项目时,Visual Studio会自动生成ControlTemplate。

在测试项目中,我将InputTitle属性连接到TextBox的内容。

<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>

我很确定,如果您觉得更简单的话,也可以与UserControl一起使用。

很明显,它不适用于Page。