【问题标题】:Calling a custom dependency property defined in code-behind from XAML从 XAML 调用代码隐藏中定义的自定义依赖项属性
【发布时间】:2015-04-09 03:23:38
【问题描述】:

是否可以在定义它的元素的 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。

【问题讨论】:

    标签: wpf xaml dependency-properties code-behind


    【解决方案1】:

    您可以在 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>
    

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

    【讨论】:

      【解决方案2】:

      我在最初发布错误答案后找到了答案:
      如果您使用 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 标记。

      【讨论】:

      • @Clemens 是的,它给我发了消息,我想,因为这是一种完全不同的方法,我宁愿创建一个新方法。如果我错了,请纠正我...
      【解决方案3】:

      我正在回答我自己的问题,因为似乎有很多方法可以正确解决它。我已经对最能帮助我的答案投了赞成票,但我不能将任何答案设置为正确答案,因为所有答案都是正确的。

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

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

      对我来说,在 XAML 中使用自定义依赖属性(在代码隐藏中定义)的最佳解决方法是 @Clemens 和 @Noel Widmer 发布的。 Thisthis

      【讨论】:

      • 或许值得一提的是,您始终可以在自己的 XAML 中绑定到 Window 的属性,因此访问属性值没有问题。仍然不确定“调用自定义依赖属性”到底是什么意思。请参阅我的更新答案。
      【解决方案4】:

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

      【讨论】:

      • 喜欢:
      • 请不要在 cmets 中为您的答案添加信息。 edit你的答案并将所有信息放在那里。
      猜你喜欢
      • 2011-12-20
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2013-10-16
      相关资源
      最近更新 更多