请问在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));
}
多谢指点!
比如我有个类,我想实现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));
}
多谢指点!
this.DataContext = this;
然后xaml中
Width = {Binding W}
那我简单说一下,绑定其实就是把另一个值跟自己的一个值绑定起来。这里面有个关键问题,如何找到 另一个值。
其实就是找到一个对象 的一个属性,首先,需要找到 对象 ,然后才是找属性,找属性用path来指定。
那么找对象,怎么找呢,就是设置binding的Source属性,打开MSDN,关于这个属性,你会看到。默认情况下,如果已设置了 DataContext 属性,则绑定会继承该属性所指定的数据上下文。但是,Source 属性是一种可以显式设置 Binding 的源和重写继承的数据上下文的方式。如果您不需要建立范围(在此范围内若干属性继承同一数据上下文)的功能,您可以使用 Source 属性,而不是 DataContext 属性。
此外,使用 Binding.ElementName 和 Binding.RelativeSource 属性还可以显式设置绑定源。但是,对于每个绑定,只能设置 ElementName、Source 和 RelativeSource 这三个属性中的一个,否则可能发生冲突。如果存在绑定源冲突,则此属性将引发异常。学习能力很重要,尤其是对程序员。
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,也许所有问题都没有到网上问的价值,但是对于问题的难度的界定是没法定性定量的,因为他对不同人是不一样的,所以,请在指责别人的时候站在别人的角度先想下,体谅下提问者的难处。非常感谢。问题依旧。多谢各位指教。
绑定的基本概念,一个绑定有一个源,还有一个目标。一个值本身可以被多处当为源,也可以即当源,又当目标。
但是,一个值不可以有多个源,这样破坏了逻辑,你想一下,一个值有多个源的时候会发生什么。