公开DependencyProperty

时间:2008-09-16 20:11:42

标签: wpf data-binding user-controls

在开发WPF UserControls时,将子控件的DependencyProperty公开为UserControl的DependencyProperty的最佳方法是什么?以下示例显示了我当前如何在UserControl中公开TextBox的Text属性。当然有更好/更简单的方法来实现这个目标吗?

<UserControl x:Class="WpfApplication3.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Background="LightCyan">
        <TextBox Margin="8" Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
    </StackPanel>
</UserControl>


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

namespace WpfApplication3
{
    public partial class UserControl1 : UserControl
    {
        public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new PropertyMetadata(null));
        public string Text
        {
            get { return GetValue(TextProperty) as string; }
            set { SetValue(TextProperty, value); }
        }

        public UserControl1() { InitializeComponent(); }
    }
}

2 个答案:

答案 0 :(得分:17)

这就是我们在没有RelativeSource搜索的情况下在团队中执行此操作的方式,而是通过UserControl的名称命名UserControl和引用属性。

<UserControl x:Class="WpfApplication3.UserControl1" x:Name="UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Background="LightCyan">
        <TextBox Margin="8" Text="{Binding Path=Text, ElementName=UserControl1}" />
    </StackPanel>
</UserControl>

有时我们发现自己制造了太多的UserControl,但往往会减少我们的使用量。我也遵循将这些文本框命名为PART_TextDisplay或其他东西的传统,以便将来你可以将其模板化,同时保持代码隐藏相同。

答案 1 :(得分:1)

你可以在UserControl的构造函数中将DataContext设置为this,然后只用路径绑定。

CS:

DataContext = this;

XAML:

<TextBox Margin="8" Text="{Binding Text} />