Question
Setting a custom property within a WPF/Silverlight page
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.
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>
and the corresponding code-behind:
using System.Windows.Controls;
namespace WpfSandbox {
public partial class TestPage : Page {
public TestPage() {
InitializeComponent();
}
public string MyProperty { get; set; }
}
}
Error message:
Error 1 The property 'MyProperty' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. Line 4 Position 7.
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).
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.
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...