微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在WPF/Silverlight页面中设置自定义属性

这听起来应该很简单。我有一个在XAML中以正常方式声明的页面(即“添加新项目…”),它有一个自定义属性。我想在与页面相关联的XAML中设置该属性

尝试这样做的方式,我设置任何其他属性不工作,因为我理解,但不知道如何工作的方式。所以我们有一些具体的讨论,这里有一些(无效)XAML。我已经减少了一切尽可能多的 – 原来有属性,如设计师的大小,但我相信那些是与我想要做的无关。

<Page x:Class="WpfSandBox.TestPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      MyProperty="MyPropertyValue">
</Page>

和相应的代码隐藏:

using System.Windows.Controls;

namespace WpfSandBox {
  public partial class TestPage : Page {
    public TestPage() {
      InitializeComponent();
    }

    public string MyProperty { get; set; }
  }
}

错误信息:

Error 1 The property ‘MyProperty’ does not exist in XML namespace
‘07000’. Line 4 Position 7.

现在我知道为什么这是失败:元素是类型的页面,并且页面没有属性名为MyProperty。这只是在TestPage …中声明的,它是由x:Class属性指定的,而不是由元素本身指定的。据我所知,这种配置是XAML处理模型(即Visual Studio集成等)所必需的。

我怀疑我可以处理这个与依赖属性,但感觉有点像过度。我也可以使用现有的属性(例如DataContext),然后将该值复制到代码中的自定义属性中,但这将是非常丑陋。

上面是一个WPF示例,但我怀疑相同的答案将适用于Silverlight。我对这两个感兴趣 – 所以如果你发布一个答案,你知道将工作在一个,但不是其他,我将不胜感激,如果你在答案内指出:

我准备踢自己,当有人发布一个绝对琐碎的解决方案…

解决方法

如果为您的页面创建了Base类,则可以使用normal属性而不使用Dependency属性

public class BaseWindow : Window
 {
   public string MyProperty { get; set; }
 }

<local:BaseWindow x:Class="BaseWindowSample.Window1" x:Name="winImp"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:BaseWindowSample" 
    MyProperty="myproperty value"
    Title="Window1" Height="300" Width="300">

</local:BaseWindow>

并且它工作,即使MyProperty不是依赖或附加。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐