0

我在 WPF 中工作,我正在创建一些 userControl,其中一些在其他内部。

在我的一个 userControls 背后的代码中,我创建了一个依赖属性,如下所示:(MyInnerControl.xaml.cs)

public static DependencyProperty MyDependencyProperty = DependencyProperty.Register(
        "MyProperty",
        typeof(Object),
        typeof(MyInnerControl));

public Object MyProperty
    {
        get
        {
            return (Object)GetValue(MyDependencyProperty );
        }
        set
        {
            SetValue(MyDependencyProperty , value);
        }
    }
...
...

而且这个属性工作得很好,但是我尝试在另一个 userControl 中公开这个依赖项,如下所示:

在我的容器 userControl 后面的代码中:(MyContainerControl.xaml.cs)

    public static DependencyProperty MyExternalDependencyProperty = DependencyProperty.Register(
        "MyExternalProperty",
        typeof(Object),
        typeof(MyContainerControl));

public Object MyExternalProperty
    {
        get
        {
            return (Object)GetValue(MyExternalDependencyProperty );
        }
        set
        {
            SetValue(MyExternalDependencyProperty , value);
        }
    }
...
...

在我的 XAML 中:(MyContainerControl.xaml)

<UserControl x:Class="MyControls.MyContainerControl" Name="this"
         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" 
         mc:Ignorable="d" 
         d:DesignHeight="329" d:DesignWidth="535" xmlns:my="clr-namespace:MyInnerControls">
<Grid>
    <my:MyInnerControl Margin="6,25,6,35" MyProperty="{Binding ElementName=this, Path=MyExternalProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
...
...

最后,我将 MyContainerControl 添加到网格并绑定到我的 viewModel,如下所示:(AnotherContainer.xaml)

...
<MyContainerControl MyExternalProperty="{Binding MyExternalProperty}"/>
...

我的问题是我的 ExternalProperty 没有获取或设置任何值。我究竟做错了什么?

澄清一下,我的 DataContext 设置正确。

希望有人可以帮助我,在此先感谢您。

4

2 回答 2

1

在我看来,问题是由于您没有遵循依赖属性命名约定,即将您的依赖属性名称设置为<ProperyName>Property(eg MyExternalProperty) 并使用具有相同名称的 CLR 属性包装器,但省略了“属性”后缀(在本例中为MyExternal)。遵循此约定应该可以解决您的问题。

来自MSDN - 依赖属性概述

属性的命名约定及其支持的 DependencyProperty 字段很重要。字段的名称始终是属性的名称,并附加后缀 Property。有关此约定及其原因的更多信息,请参阅自定义依赖属性。

编辑:还有一些事情:

  1. 您的依赖属性注册是错误的:您正在传递"MyProperty"而不是"MyDependency""MyExternalProperty"而不是"MyExternalDependency"
  2. 您应该避免将this其用作任何控件的名称,因为它是保留关键字。
于 2012-06-19T19:56:57.317 回答
0

您应该给您的 UserControl 一个 x:Name 并将该值用于 ElementName

<UserControl x:Class="MyControls.MyContainerControl" Name="this"
     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" 
     mc:Ignorable="d" 
     x:Name="ThisUserControl"
     d:DesignHeight="329" d:DesignWidth="535" xmlns:my="clr-namespace:MyInnerControls">
<Grid>
    <my:MyInnerControl Margin="6,25,6,35" MyProperty="{Binding ElementName=ThisUserControl, Path=MyExternalProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

……

于 2012-06-19T19:59:32.933 回答