【问题标题】:silverlight basic data bindingsilverlight 基本数据绑定
【发布时间】:2009-08-16 05:03:56
【问题描述】:

我无法理解 the Silverlight documentation 的数据绑定。我寻求一个非常简单的例子。

假设我在 XAML 文件中定义了一个 UserControl。 UserControl 的顶层子级是一个 Grid,有 n 列和 m 行。网格内是一个矩形。像这样:

<UserControl....
    <Grid ...>
        <Rectangle ...>

矩形应显示在网格内的特定(行、列)中。根据各种事件,此行/列对在运行时更改。

我想我可以为此使用数据绑定。有人可以确认这是对数据绑定的合理使用吗?

我想我可以这样做:

 <Rectangle  x:Name="rect"
     Grid.Column = "{Binding ???}"
     Grid.Row = "{Binding ???}"  />

但是,我不知道该绑定什么。

那里有什么?而且,我如何验证我放在那里的内容?看来我可以放任何我喜欢的字符串,甚至是独立宣言的全文,而且它的行为方式完全相同。在今天,它什么也没做。这没用。它不会抛出异常。

我不知道那个字符串应该是什么。而且我不知道如何调试我放在那里的东西。似乎没有办法知道它是正确的、有效的还是荒谬的。

一个简单的例子就足够了。我不知道为什么 MSDN 文档如此迟钝。难道只有我一个不懂事吗like this

在 Silverlight 中,您可以绑定到任何依赖项属性的目标值。数据绑定的源属性值不必是依赖属性;如果满足某些条件,它可以是 CLR 对象的属性(请参阅数据绑定)。源对象也可以是通过名称或对象图中的相对位置引用的现有依赖对象。在 Silverlight 中,您可以绑定到任何依赖项属性的目标值。数据绑定的源属性值不必是依赖属性;如果满足某些条件,它可以是 CLR 对象的属性(请参阅数据绑定)。源对象也可以是通过名称或对象图中的相对位置引用的现有依赖对象。

那种文档让我想跌倒哭泣。谁写的废话?并且文档页面没有包含一个示例来显示所有这些词的含义。听着,英语是我的第一语言。我认为自己是一个 .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 属性在网格内(在用户控件内)绑定矩形的位置怎么办。我可以这样做吗?我可以将 Grid.RowProperty 和 Grid.ColumnProperty 绑定到 something 吗?如果 X 和 Y 是这样的:

public partial class MyThing : UserControl
{
    public int X { get; set; }
    public int Y { get; set; }
    ....
}

我可以将它绑定到矩形的 grid.row 和 grid.column 吗?怎么样?

请有人澄清并举一个简单的例子。

【问题讨论】:

    标签: .net silverlight data-binding


    【解决方案1】:

    每个FrameworkElement 都有一个DataContext,它(如果不为空)是任意数据类的一个实例。您正在绑定到该 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);
    

    FrameworkElementDataContext 在大多数情况下是从其父代继承而来的。您可以看到这如何使编辑更复杂的对象变得相当简单。

    <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>
    

    (您会注意到,在这种情况下,我在 Binding 上设置了另一个属性:Mode=TwoWay。这是将控件中的更改传播回 DataContext 所必需的。)

    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; 
        }
    }
    

    在控件层次结构中的任何一点,您都可以指定一个新的DataContext,它将被子级从该点向下继承。

    Silverlight 3 引入了一个新的绑定标记扩展 ElementName,它允许您将另一个 XAML 元素指定为绑定源。我尝试给我的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 实现了此接口,并在其属性更改时触发PropertyChanged 事件,则与这些属性的绑定将获取更改并将它们传播到控件。

    【讨论】:

    • 非常有趣。你能回过头来让这个例子适合我的情况吗?我可以绑定到 UserControl 上存在的属性,它是相关 Rectangle 的根父级吗? ?如何在 XAML 中为 Rectangle 指定数据上下文?我可以(在 XAML 中)指定 Rectangle 的数据上下文是 UserControl 吗?还是隐含地理解?
    • 我添加了一些关于您的情况的信息。
    • 听着,感谢您为此付出的努力。您显然需要一些时间来整理这个答案。 INotifyPropertyChanged 如何适应?所以我需要在 UserControl 中设置 DataContext=this,如果我想将 UserControl 中子控件的属性绑定到 UserControl 类上的 C# 属性...?
    • 很高兴为您提供帮助——我再次更新了INotifyPropertyChanged。是的,我很确定这是绑定到父控件的唯一方法——你可以试试ElementName 语法;我只尝试在没有运气的情况下使用它一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2012-04-29
    相关资源
    最近更新 更多