与UserControl和WPF对话框有关的DependencyProperty问题

时间:2018-10-22 19:40:13

标签: wpf user-controls dependency-properties

我已尽我所能地简化了代码,以尝试获得有效的代码,但仍然很短。一些建议将不胜感激。

我试图使DependencyProperty正常工作,就是这么简单,但是我在主窗口中设置的数据并未显示在用户控件中。

在MainWindow中,我将xaml中的T​​extValue设置为“ hi”。 TextValue在xaml中显示出来并可以很好地进行编译,因此我很确定自己对DependencyProperty的设置正确。对话框完全打开后,请查看调试器,我的属性TextValue仍为null。

我是否缺少设置数据上下文?也许我在做自己想做的事时没有根据。

感谢您抽出宝贵的时间弄清楚我在做什么错。

我的用户控件是:UserControl1 Xaml:

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             Loaded="UserControl_Loaded"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

    </Grid>
</UserControl>

UserControl1.xaml.cs是:

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        public static readonly DependencyProperty TextProperty = DependencyProperty.Register("TextValue", typeof(string), typeof(UserControl1));

        private string _tv;
        public string TextValue
        {
            get
            {
                return _tv;
            }
            set
            {
                _tv = value;
            }
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {

        }
    }
}

我的呼叫窗口xaml是:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:usercontrols="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525"
        Loaded='Window_Loaded'>
    <Grid>
        <usercontrols:UserControl1 x:Name="usercontroltest1" TextValue="hi"/>
    </Grid>
</Window>

我的呼叫窗口.cs是:

    namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

        }
    }
}

1 个答案:

答案 0 :(得分:0)

“属性包装器”的获取器和设置器必须调用DependencyObject基类的GetValue和SetValue方法,如下所示。除此之外,还有一个命名约定,该约定要求将依赖项属性的标识符字段命名为该属性,再加上一个Property后缀。有关所有详细信息,请参见Custom Dependency Properties

public static readonly DependencyProperty TextValueProperty =
    DependencyProperty.Register(
        nameof(TextValue), typeof(string), typeof(UserControl1));

public string TextValue
{
    get { return (string)GetValue(TextValueProperty); }
    set { SetValue(TextValueProperty, value); }
}

为了在自己的XAML中访问UserControl的依赖项属性,通常应使用如下所示的RelativeSource绑定:

<UserControl x:Class="WpfApplication1.UserControl1" ...>
    <Grid>
        <TextBlock Text="{Binding TextValue,
                          RelativeSource={RelativeSource AncstorType=UserControl}}" />
    </Grid>
</UserControl>