【问题标题】:Declaratively set property of MyUserControl in MyUserControl.xaml在 MyUserControl.xaml 中以声明方式设置 MyUserControl 的属性
【发布时间】:2009-03-18 12:25:38
【问题描述】:

假设我们有这样的控制:

public partial class MyUserControl : UserControl
{
    public MyUserControl() {
        InitializeComponent();
    }

    public string Foo { get; set; }
}

如何在 MyUserControl.xaml 中以声明方式设置“Foo”属性值?

<UserControl x:Class="Test.MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <!-- Looking for some thing like this -->
    <Foo>Hola</Foo>

</UserControl>

更清楚一点:如何在 XAML 中为代码隐藏中定义的属性设置值。

【问题讨论】:

    标签: wpf xaml user-controls


    【解决方案1】:

    我过去发现,您可以使用样式从 xaml 设置 UserControl 上的属性,而无需继承。试试这样的:

    <UserControl x:Class="Test.MyUserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:Test.MyUserControl" >
    
        <UserControl.Style>
            <Style>
                <Setter Property="c:MyUserControl.Foo" Value="Hola" />
            </Style>
        </UserControl.Style>
    
    </UserControl>
    

    【讨论】:

    • 感谢您的发现!我们只需要将 Foo 声明为依赖属性即可。
    • +1 但是,这只是部分解决方案,因为 Styles 不能完成简单的属性设置器语法可以做的所有事情(绑定和其他标记扩展)。可悲的是,我认为这是目前唯一的方法。
    【解决方案2】:

    这只能在xaml中通过继承来实现:

    您正在为您的控件提供实现。因此,在 xaml 中为您的控件实现值的唯一方法是通过继承。

    您的第二个 UserControl 将如下所示:

    <Test:MyUserControl x:Class="Test.MyUserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:Test="clr-namespace:Test"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
        <Test:MyUserControl.Foo>Hola</Test:MyUserControl.Foo>
    
    </Test:MyUserControl>
    

    或:

    <Test:MyUserControl x:Class="Test.MyUserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:Test="clr-namespace:Test"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Foo="Hola">
    
    </Test:MyUserControl>
    

    【讨论】:

    • 1 - 不是 XAML 解决方案,2-3 不起作用,4 - 不是所要求的 ;-)
    • 哎呀,我的错..它不能在同一个控件中实现..继承是唯一的方法..
    【解决方案3】:

    在你的控件中设置它在构造函数中

    public MyUserControl{ this.Foo = "Hola";}
    

    如果您在其他地方使用该控件:

    <Window xmlns:mycontrol="Test"     ....
    

    Intellisense 将帮助您使用正确的 xmlns 语法

    <mycontrol:MyUserControl       Foo="Hola"/>
    

    我不确定,但 Foo 可能需要成为 DependencyProperty。

    【讨论】:

    • 如果我将 Foo 声明为 属性,它会在 UserControl 类中查找它而不是 MyUserControl。
    • 是的,没错。我在您发表评论之前更正了代码。在构造函数中的控件集 Foo 中。
    • 谢谢 wwosik,我以为我实际上并没有尝试设置它,只是尝试找出 XAML 的可能性:-) 所以很好奇,如果我们可以在控制相关的 XAML 端做到这一点xml.
    【解决方案4】:

    看来您真正想要的是UserControl 上属性的默认值。不幸的是,您不能将其设置为Style,除非它是DependencyProperty。它也不能成为Binding 的目标。

    如果FooDependencyProperty,则可以在声明DependencyProperty 时将其设置在PropertyMetadata 中:

    public static readonly DependencyProperty FooProperty = DependencyProperty.Register("Foo", typeof(String), typeof(MyUserControl), new PropertyMetadata("Hola"));
    

    否则你最好在代码隐藏中设置默认值。

    【讨论】:

    • 感谢您的回答,但重点是在 XAML 中执行此操作
    【解决方案5】:

    非字符串属性怎么样。例如我的自定义对象=

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2011-01-13
      • 2018-09-21
      • 2023-03-17
      相关资源
      最近更新 更多