我无法理解the Silverlight documentation数据绑定。我寻求一个非常简单的例子。
假设我在XAML文件中定义UserControl。 UserControl的顶级子节点是一个网格,有n列和m行。 Grid中有一个Rectangle。像这样:
<UserControl....
<Grid ...>
<Rectangle ...>
矩形应显示在网格中的特定(行,列)中。根据各种各样的情况,这个行/列对在运行时会发生变化。
我想我可以使用数据绑定。有人可以确认这是合理使用数据绑定吗?
我想我可以这样做:
<Rectangle x:Name="rect"
Grid.Column = "{Binding ???}"
Grid.Row = "{Binding ???}" />
但是,我不知道要为绑定做什么。
那里有什么?而且,我如何验证我放在那里的东西?我似乎可以放任何我喜欢的字符串,甚至是独立宣言的全文,它的行为完全一样。哪一天,它什么都不做。这是行不通的。它没有抛出异常。
我不知道该字符串应该是什么。而且我不知道如何调试我放在那里的东西。似乎无法知道它是正确的还是有效的还是荒谬的。
一个简单的例子即可。我不知道为什么MSDN doc如此愚蠢。我只是一个无法理解事物的人like this
在Silverlight中,您可以绑定到任何依赖项属性的目标值。数据绑定的source属性值不必是依赖属性;如果满足某些条件,它可以是CLR对象上的属性(请参阅数据绑定)。源对象也可以是通过名称或对象图中的相对位置引用的现有依赖项对象。在Silverlight中,您可以绑定到任何依赖项属性的目标值。数据绑定的source属性值不必是依赖属性;如果满足某些条件,它可以是CLR对象上的属性(请参阅数据绑定)。源对象也可以是通过名称或对象图中的相对位置引用的现有依赖项对象。
那种文件让我想堕落而哭泣。谁写那个垃圾?并且doc页面不包含显示所有这些单词的含义的单个示例。听着,英语是我的第一语言。我认为自己是.NET开发人员。但我无法理解该段落中的任何一段话。编写它的人或委员会应该被取回并开枪。两次。
即使在MSDN页面之外,我也无法找到实际显示silverlight数据绑定如何工作的示例。 MSDN中有一些示例显示
之类的内容<Binding ...who cares? ....>
但我不知道那是什么东西。它不在我的xaml中,我不认为我想要它在我的xaml中。我所拥有的是一个实际的控件,以及一个Rectangle。我可以通过数据绑定指定矩形的Grid.Column或Grid.Row吗?
现在,我告诉你,Rectangle位于Grid中,它是UserControl的子节点。
<UserControl....
<Grid ...>
<Rectangle ...>
我得到UserControl的代码隐藏文件,它看起来像这样:
public partial class MyThing : UserControl
{
....
}
如果我想通过UserControl上的int属性绑定网格中的矩形的位置(在usercontrol中),该怎么办?我能这样做吗?我可以将Grid.RowProperty和Grid.ColumnProperty绑定到某些东西吗?如果X和Y是这样的:
public partial class MyThing : UserControl
{
public int X { get; set; }
public int Y { get; set; }
....
}
我可以将它绑定到矩形的grid.row和grid.column吗?怎么样?
请有人澄清并举一个简单的例子。
答案 0 :(得分:4)
每个FrameworkElement
都有DataContext
,其中(如果不为null)是任意数据类的实例。您绑定到DataContext
的属性。
<Rectangle Width="{Binding MyRectWidth}" x:Name="_myRect" />
代码隐藏:
public class Foo
{
public double MyRectWidth { get; set; }
}
Foo foo = new Foo();
foo.MyRectWidth = 100;
_myRect.DataContext = foo;
符号{Binding MyRectWidth}
是{Binding Path=MyRectWidth}
的简写。
您可以为绑定指定其他参数,例如实现IValueConverter
的对象的实例,以在源值和目标值之间进行转换。
XAML语法的编程版本是Binding
对象:
Binding b = new Binding();
b.Path = "MyRectWidth";
_myRect.SetBinding(Rectangle.WidthProperty, b);
FrameworkElement
的{{1}}在大多数情况下是从其父级继承的。您可以看到这如何使编辑更复杂的对象变得相当简单。
DataContext
(在这种情况下,我会注意到我在绑定上设置了另一个属性:<UserControl x:Class="PersonEditControl">
<StackPanel>
<TextBox Text="{Binding Name, Mode=TwoWay}" />
<TextBox Text="{Binding Address, Mode=TwoWay}" />
<TextBox Text="{Binding Phone, Mode=TwoWay}" />
</StackPanel>
</UserControl>
。这是将控件中的更改传播回DataContext所必需的。)
Mode=TwoWay
在控制层次结构中的任何一点,您都可以指定一个新的public class Person
{
public string Name { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
}
public partial class PersonEditControl
{
void SetPerson(Person p)
{
// child controls inherit this DataContext, if they are
// not explicitly given another:
DataContext = p;
}
}
,并且从那一点开始,子项将继承它。
Silverlight 3引入了一个新的绑定标记扩展DataContext
,它允许您指定另一个XAML元素作为绑定源。我在为ElementName
命名(让我们说UserControl
),然后在子控件的属性中指定_myControl
,但它没有用。
我没有花太多时间在上面,我可能错过了一些东西。至少,您可以手动指定此关系:
{Binding Path=PropertyName, ElementName=_myControl}
这个难题的另一个重要部分是界面public partial class MyThing : UserControl
{
public int X { get; set; }
public int Y { get; set; }
public MyThing()
{
InitializeComponent(); // important to call this first: loads the XAML
_myRect.DataContext = this;
}
}
。如果INotifyPropertyChanged
实现此接口,并在其属性发生更改时触发DataContext
事件,则对这些属性的绑定将获取更改并将它们传播到控件。