从XAML调用在代码后台定义的自定义依赖属性

5

能否在定义依赖属性的元素的XAML中调用自定义依赖属性?

我的意思是,我有一个简单的mainWindow代码如下:

Code

public partial class MainWindow : Window
{

    public static readonly DependencyProperty SpecialToProperty =   DependencyProperty.Register("SpecialTo", typeof(double), typeof(MainWindow));

    public MainWindow()
    {

        InitializeComponent();

    }

    public double SpecialTo
    {
        get
        {
            return (double)GetValue(SpecialToProperty);
        }
        set
        {
            SetValue(DoubleAnimation.ToProperty, value);
        }
    }
}

我该如何在MainWindow类的XAML部分代码中使用依赖属性?

我的意思是像这样:

<Window x:Class="WpfAnimationTEst.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"        
    SpecialTo=200>

我知道可以使用附加的依赖属性来实现,但是这是唯一的方法吗?难道不能调用在代码后台中定义的依赖属性吗?

谢谢您,如果问题有些愚蠢,请谅解,我只是在学习并尝试理解WPF。

4个回答

3

我在最初发布了错误答案后找到了正确答案:
问题实际上在于如果使用andreask的答案时会出现循环依赖。我必须为所有窗口创建一个基类:
1) 创建新的窗口基类:

public class BaseWindow : Window {
    public BaseWindow() { }

    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(BaseWindow));

    public double SpecialTo {
        get {
            return (double)GetValue(SpecialToProperty);
        }
        set {
            SetValue(SpecialToProperty, value);
        }
    }
}

这将成为所有窗口的新基类。
2) 修改你的MainWindow xaml:
(将YOURNAMESPACE(两处)更改为你的命名空间名称)

<local:BaseWindow x:Class="YOURNAMESPACE.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:YOURNAMESPACE"
        Title="MainWindow" Height="350" Width="525" SpecialTo="100">
    <Grid>

    </Grid>
</local:BaseWindow>

3) 你还需要修改部分MainWindow.cs文件:
 public partial class MainWindow : BaseWindow {
        public MainWindow() {
            InitializeComponent();
        }
    }

这对我来说有效,但是你总是需要在窗口声明中使用额外的XAML标记。


@Clemens 是的,我知道,它给我发了消息,我想既然这是一种完全不同的方法,我宁愿创建一个新的。如果我错了,请纠正我... - Noel Widmer

1

我回答自己的问题,因为似乎有很多种正确的解决方法。我已经给最有帮助的答案点了赞,但是我不能将任何一个设置为正确答案,因为所有答案都是正确的。

所以我只会发布一个结论。如果您认为我错了,请发表评论,我会更正我的想法。

我的问题的主要答案是否定的,即不可能直接从其“链接”的XAML文件中调用在代码后台中定义的自定义依赖属性。必须实例化定义该属性的控件才能调用它。

对于我来说,在XAML中使用在代码后台中定义的自定义依赖属性的最佳解决方法是由@Clemens和@Noel Widmer发布的此处此处


也许值得一提的是,您始终可以在 Window 的自身 XAML 中绑定到其属性,因此访问属性值没有问题。仍然不确定您所说的“调用自定义依赖属性”具体指什么。请参阅我的更新答案。 - Clemens

0

您可以在XAML中使用自定义依赖属性,但前提是您必须在XAML中实例化控件。例如,考虑一个自定义的TextBox元素:

public class MyTextBox : TextBox
{
    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(MyTextBox));

    public double SpecialTo
    {
        get
        {
            return (double)GetValue(SpecialToProperty);
        }
        set
        {
            SetValue(DoubleAnimation.ToProperty, value);
        }
    }
}

当然,您可以在XAML中创建MyTextBox的实例并在那里分配SpecialTo属性:

<custom:MyTextBox SpecialTo="1.0" />

在您的情况下,您没有实例化自定义类MainWindow,而是创建了一个新的Window类的实例,Window类不知道自定义依赖属性(SpecialTo属性甚至在Window中都不可用,因为您在MainWindow类中声明了它)。
要识别依赖属性,您需要直接实例化MainWindow
<custom:MainWindow
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"        
    SpecialTo=200>

然而,这意味着您需要省略x:class指令,该指令用于组合窗口的XAML和代码后台(否则您将遇到循环依赖),我不确定这是否正确初始化了您的窗口...


0

是的,这是可能的。依赖属性用于在XAML中进行绑定。如果您想要绑定到在代码后台窗口中定义的属性,则需要将此窗口引用为XAML元素,即为主窗口添加标签x:Name="mainWindow",然后在绑定表达式中引用它作为ElementName=mainWindow。


<TextBox Text="{Binding Path=FirstName, ElementName=mainWindow}" - Andrey Batchvarov
1
请不要在评论中添加信息。[编辑]您的答案并将所有信息放在那里。 - David Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接