从XAML调用代码隐藏中定义的自定义依赖项属性

时间:2015-02-09 11:39:49

标签: wpf xaml dependency-properties code-behind

是否可以在定义它的元素的XAML中调用自定义依赖项属性?

我的意思是,我的mainWindow有以下简单代码:

代码

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 个答案:

答案 0 :(得分:3)

我在最初发布错误答案后找到答案:
如果你使用andreask的答案,问题实际上在于循环依赖。我必须为所有窗口创建一个BaseClass:
1)创建一个新的Window Base Class:

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(2x)更改为您的命名空间名称)

<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标记。

答案 1 :(得分:1)

我正在回答我自己的问题,因为似乎有很多方法可以正确地解决它。我推荐了最能帮助我的答案,但我不能将其作为正确的答案,因为一切都是正确的。

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

我的问题的主要答案是否定的,不能直接从其“链接”XAML文件调用代码隐藏中定义的自定义依赖项属性。必须实例化定义属性的控件来调用它。

对我来说,在代码隐藏中定义的在XAML中使用自定义依赖项属性的最佳工作方式是由@Clemens和@Noel Widmer发布的。 Thisthis

答案 2 :(得分: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类不是&#39 ; t。知道自定义依赖项属性(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>

但是,这意味着你需要省略用于组合XAML和窗口代码隐藏的x:class指令(否则你会遇到循环依赖),我不确定是否这正确地使你的窗户正常化...

答案 3 :(得分:0)

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