3

当我有一个用户控件具有我想绑定到 XAML 中的资源的属性时,我通常在包含该控件的控件或窗口中设置该绑定。例如:

<local:MyNeatControl MyProperty="{StaticResource ...}" />

这会将 MyNeatControl 对象的该实例的 MyProperty 属性设置为父控件中的资源。

但是,当我有一个窗口时,我想将它的属性之一绑定到它自己的资源之一时该怎么办?在代码中很容易做到:

public MainWindow()
{
    this.Loaded += new RoutedEventHandler(this.MainWindow_Loaded);
    ...
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    this.MyProperty = this.Resources["MyProperty"] as MyProperty;
    ...
}

但这让我很困扰。我宁愿在 XAML 中绑定属性,也不愿在代码中设置它。

我该怎么做?我尝试将 MyProperty 声明添加为元素的属性。但我收到一个错误:

The property 'MyProperty' was not found in type 'Window'.

我缺少一些简单的东西吗?

4

2 回答 2

2

尝试使用DynamicResource而不是StaticResource.

例子:

<Window x:Class="BindingToOwnResources.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="{DynamicResource WindowWidth}">
    <Window.Resources>
        <System:Double x:Key="WindowWidth">300</System:Double>
    </Window.Resources>
    <Grid>

    </Grid>
</Window>
于 2012-10-30T08:10:53.923 回答
1

基本问题是数据类型。

当我在 XAML 文件中声明子元素时,该子元素的声明具有该子元素的类型。这声明了一个 MyNeatControl 类型的对象,在它的声明中,我可以访问该类型的属性:

<local:MyNeatControl MyProperty="{StaticResource ...}" />

但是,当我声明一个类型时,无论是窗口还是控件,XAML 文件中对象的类型都是它的父对象的类型。这定义了一个继承自 MyWindowBase 的 MyWindow 类,但在 XAML 中,范围内的类型是 MyWindowBase,而不是MyWindow:

<local:MyWindowBase
        x:Class="MyProject.MyWindow"
        ....
        >
    <local:MyWindowBase.Resources>
        ...
    </local:MyWindowBase.Resources>
    ...
</local:MyWindowBase>

那么该怎么办?回避问题。使用样式:

<local:MyWindowBase>
    <Style TargetType="local:MyWindow">
        <Setter Property="MyProperty" Value="{StaticResource ..}" />
    </Style>
</local:MyWindowBase>

这会将 MyWindow 的“MyProperty”属性设置为指定的资源。

于 2012-10-31T18:11:53.680 回答