请问在XAML中如何将继承类的属性绑定到基类的属性上?
比如我有个类,我想实现W到Width的绑定(下面代码是在C#中实现,但是如果我想在XAML中实现应该怎么写呢?):
XAML定义:<UserControl x:Class="CardTest.Card"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="100" Width="100" x:Name="control">
    <Grid x:Name="GridMain" Background="LightBlue">    </Grid>
</UserControl>C#定义:    public partial class Card : UserControl
    {
        public Card()
        {
            InitializeComponent();
            Binding binding = new Binding("Width") { Source = this };
            this.SetBinding(WProperty, binding);
        }
        public int W
        {
            set { SetValue(WProperty, value); }
            get { return (int)GetValue(WProperty); }
        }
        public int H
        {
            set { SetValue(HProperty, value); }
            get { return (int)GetValue(HProperty); }
        }
        public readonly static DependencyProperty WProperty
            = DependencyProperty.Register("W", typeof(int), typeof(Card));
        public readonly static DependencyProperty HProperty
            = DependencyProperty.Register("H", typeof(int), typeof(Card));
    }
多谢指点!

解决方案 »

  1.   

    在Card()中加一句
    this.DataContext = this;
    然后xaml中
    Width = {Binding W}
      

  2.   

    楼主,我问一句,你知道绑定的基本过程是什么吗?不知道的话先补习补习基本知识。我本人特别讨厌一个问题问一遍以上的。
    那我简单说一下,绑定其实就是把另一个值跟自己的一个值绑定起来。这里面有个关键问题,如何找到 另一个值。
    其实就是找到一个对象 的一个属性,首先,需要找到 对象 ,然后才是找属性,找属性用path来指定。
    那么找对象,怎么找呢,就是设置binding的Source属性,打开MSDN,关于这个属性,你会看到。默认情况下,如果已设置了 DataContext 属性,则绑定会继承该属性所指定的数据上下文。但是,Source 属性是一种可以显式设置 Binding 的源和重写继承的数据上下文的方式。如果您不需要建立范围(在此范围内若干属性继承同一数据上下文)的功能,您可以使用 Source 属性,而不是 DataContext 属性。
     
    此外,使用 Binding.ElementName 和 Binding.RelativeSource 属性还可以显式设置绑定源。但是,对于每个绑定,只能设置 ElementName、Source 和 RelativeSource 这三个属性中的一个,否则可能发生冲突。如果存在绑定源冲突,则此属性将引发异常。学习能力很重要,尤其是对程序员。
      

  3.   

    非常感谢各位的热心回复。
    to 1楼:
    可能我没有表述清楚,我想要实现的是将W(我自己新增的属性)绑定到Width(UserControl原有属性)上,也就是W是目标,Width才是源。
    to 2楼:
    首先非常感谢您的指点和回复。这两天刚看WPF,所以对其思路不是很了解,所以问了些愚蠢的问题,请见谅。
    1)绑定的基本过程,我看了。
    2)如对1楼回复的内容,我不认为和之前的问题是一个问题,我也讨厌同一个问题问两次,但是请看好代码之后再做定论。
    以上问题不是同一个问题的原因如下(当然可能在熟悉的人看来,根本就很愚蠢但是我目前确实没有搞清楚,所以提问):
    1)绑定的基本内容的确是将自己的属性绑定到一个源上,但是在XAML代码中,我看到,整个代码的类型是UserControl,所以肯定没有我新增的W属性,所以我认为我是不能通过<UserControl .... W="{Binding ...}">...</UserControl>这样的形式来实现的。
    2)但是我现在想实现W="{Binding...}"这样的形式怎么办?我不知道。按照我定义Card的过程,当然我可以新定义一个CarNew:Card,然后再CardNew的XAML里边写W="{Binding...}",之后就是用CardNew,但是这样肯定是扯淡,我知道肯定不是这样实现的,所以我尝试在开始定义些loal=...(Card类)之类的方式,但是都提示错误,根据我今天看的书,好像Template中的DataTemplate可以解决这个问题,但是我现在不想做Template,我想先看下最直接的实现方式是怎么样,了解下一遍后续学习,所以就有了以上的提问。非常感谢您的热心,但是在初学者学习的时候的确是会遇到一些高手根本不屑的问题,我想让您了解的是,如果不是经过自己的一番努力仍没有找到结果,一般人也不会来这里问别人,给别人添麻烦。当然,所有问题都可以解决,通过不断地研究msdn,也许所有问题都没有到网上问的价值,但是对于问题的难度的界定是没法定性定量的,因为他对不同人是不一样的,所以,请在指责别人的时候站在别人的角度先想下,体谅下提问者的难处。非常感谢。问题依旧。多谢各位指教。
      

  4.   

    但是我现在想实现W="{Binding...}"这样的形式怎么办?W本身是Card 中的属性,你在Card中把W绑定一个源这本身就不合理,而是应该把Width 的源定义为W,然后OneWayToSource。
    绑定的基本概念,一个绑定有一个源,还有一个目标。一个值本身可以被多处当为源,也可以即当源,又当目标。
    但是,一个值不可以有多个源,这样破坏了逻辑,你想一下,一个值有多个源的时候会发生什么。
      

  5.   

    哦,明白了,看来我对基本的设计思路还是不了解,原来这个就是那个什么Model的意义。非常感谢,受益匪浅,看来我还是要看下基本的设计思想。给分,呵呵