问题描述
这听起来应该很简单.我有一个 Page
以正常方式在 XAML 中声明(即使用添加新项目...")并且它有一个自定义属性.我想在与页面关联的 XAML 中设置该属性.
This sounds like it should be simple. I have a Page
declared in XAML in the normal way (i.e. with "Add new item...") and it has a custom property. I'd like to set that property in the XAML associated with the page.
尝试以与我设置任何其他属性相同的方式执行此操作是行不通的,原因我理解但不知道如何解决.为了让我们有一些具体的讨论,这里有一些(无效的)XAML.我已经尽可能地减少了所有内容 - 最初有诸如设计师尺寸之类的属性,但我相信这些与我想要做的事情无关.
Trying to do this the same way that I'd set any other property doesn't work, for reasons I understand but don't know how to work round. Just so we've got something concrete to talk about, here's some (invalid) XAML. I've reduced everything down as much as possible - originally there were attributes such as the designer size, but I believe those are irrelevant to what I'm trying to do.
<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; }
}
}
错误信息:
错误 1 XML 命名空间中不存在属性MyProperty"'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.第 4 行位置 7.
现在我知道为什么会失败了:元素的类型是 Page
,而 Page
没有名为 MyProperty
的属性.这仅在 TestPage
... 中声明,由 x:Class
属性指定,而不是元素本身.据我所知,XAML 处理模型(即 Visual Studio 集成等)需要此配置.
Now I know why this is failing: the element is of type Page
, and Page
doesn't have a property called MyProperty
. That's only declared in TestPage
... which is specified by the x:Class
attribute, but not by the element itself. As far as I'm aware, this configuration is required by the XAML processing model (i.e. the Visual Studio integration etc).
我怀疑我可以用依赖属性来处理这个问题,但这感觉有点矫枉过正.我也可以使用现有的属性(例如 DataContext
),然后稍后在代码中将该值复制到自定义属性中,但这会非常难看.
I suspect I could handle this with a dependency property, but that feels a little like overkill. I could also use an existing property (e.g. DataContext
) and then copy the value into the custom property in code later, but that would be pretty ugly.
以上是一个 WPF 示例,但我怀疑同样的答案也适用于 Silverlight.我对两者都感兴趣 - 所以如果你发布一个你知道可以在其中一个而不是另一个中工作的答案,如果你能在答案中指出这一点,我将不胜感激:)
The above is a WPF example, but I suspect the same answers will apply in Silverlight. I'm interested in both - so if you post an answer which you know will work in one but not the other, I'd be grateful if you'd indicate that within the answer :)
当有人发布一个绝对微不足道的解决方案时,我正准备踢自己......
I'm preparing to kick myself when someone posts an absolutely trivial solution...
推荐答案
如果为页面创建基类,则可以使用没有依赖属性的普通属性.
You can work with normal property without Dependency property if you create a Base class for your Page.
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 不是依赖项或附加项,它也能工作.
And it works even though MyProperty is not a Dependency or Attached.
这篇关于在 WPF/Silverlight 页面中设置自定义属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!