1

我创建了一个带有方向属性的 UserControl。所有的定位工作都应该由内部堆栈面板完成,所以我将它绑定到属性。

这在运行时工作正常,但 WPF 设计器显示堆栈面板的默认值(垂直)而不是方向属性的默认值(水平)。

这是简化的示例。XAML:

<UserControl x:Class="MyWpf.MyUserControl"
             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" xmlns:MyWpf="clr-namespace:MyWpf"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel Orientation="{Binding Path=Orientation, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyWpf:MyUserControl}}}">
        <TextBlock>A</TextBlock>
        <TextBlock>B</TextBlock>
        <TextBlock>C</TextBlock>
    </StackPanel>
</UserControl>

后面的代码:

public partial class MyUserControl : UserControl
{
    public static readonly DependencyProperty OrientationProperty;

    static MyUserControl()
    {
        OrientationProperty = DependencyProperty.Register( "Orientation", typeof( Orientation ), typeof( MyUserControl ), new FrameworkPropertyMetadata( Orientation.Horizontal ) );
    }

    public Orientation Orientation
    {
        get
        {
            return (Orientation)GetValue( OrientationProperty );
        }
        set
        {
            SetValue( OrientationProperty, value );
        }
    }

    public MyUserControl()
    {
        InitializeComponent();
    }
}

我看到的唯一解决方案是将方向包含在 ViewModel 中(并使用 DesignData),但我希望它是干净的。我希望有像 DesignData 这样的东西,但对于控件本身。

4

1 回答 1

0

也许这会有所帮助

有哪些方法可用于 WPF 中的虚拟设计时数据?

我猜你可以尝试设置d:Orientation你的StackPanel.

大多数绑定扩展在运行时发挥它们的魔力(有时您需要,有时在编译时)。我不是 100%,但你可以尝试{Binding ElementName=_userControl, Path=Orientation}- 但即使它“有效”,我认为这对你不起作用,因为那是你的自定义属性。

这是一个关于类似内容的链接,它解释了一点(但对您的情况没有帮助)。
WPF TemplateBinding 与 RelativeSource TemplatedParent

于 2013-03-15T18:00:28.297 回答