一步一步学Silverlight 2系列(11):数据绑定

概念

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。

本文为系列文章第十一篇,主要介绍Silverlight 2中的数据绑定。

数据绑定模式

在Silverlight 2中,支持三种模式的数据绑定。

1.OneTime:一次绑定,在绑定创建时使用源数据更新目标,适用于只显示数据而不进行数据的更新。

2.OneWay:单向绑定,在绑定创建时或者源数据发生变化时更新到目标,适用于显示变化的数据。

3.TwoWay:双向绑定,在任何时候都可以同时更新源数据和目标。

Jesse Liberty举的例子非常的形象,使用Silverlight开发一个在线书店,显示书籍的书名、作者等信息,使用OneTime模式,这些数据一般不会发生变化的;显示价格信息时使用OneWay模式,因为管理员可能会在一天内调整价格;显示书籍的剩余数量时用TwoWay模式,数量随着用户的订购会随时发生变化,即目标和源数据都要进行更新。

简单数据绑定

在本示例中我们将做一个简单的数据绑定,用来显示用户信息,XAML如下:

<Grid x:Name="LayoutRoot" Background="#46461F">
    <Grid.RowDefinitions>
        <RowDefinition Height="160"></RowDefinition>
        <RowDefinition Height="40"></RowDefinition>
        <RowDefinition Height="40"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="150"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Image Source="terrylee.jpg" Width="78" Height="100"
           HorizontalAlignment="Left" Grid.Row="0" Grid.Column="1"/>
    <TextBlock Foreground="White" FontSize="18" Text="姓名:"
               Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right"/>
    <TextBlock x:Name="lblName" Foreground="White" FontSize="18"
               Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left"/>
    <TextBlock Foreground="White" FontSize="18" Text="位置:"
               Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right"/>
    <TextBlock x:Name="lblAddress" Foreground="White" FontSize="18"
               Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left"/>
</Grid>

添加一个简单User类,它具有Name和Address两个属性:

public class User
{
    public string Name { get; set; }

    public string Address { get; set; }
}

使用绑定句法{Binding Property}进行数据绑定,注意下面的两个TextBlock控件Text属性:

<Grid x:Name="LayoutRoot" Background="#46461F">
    <Grid.RowDefinitions>
        <RowDefinition Height="160"></RowDefinition>
        <RowDefinition Height="40"></RowDefinition>
        <RowDefinition Height="40"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="150"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Image Source="terrylee.jpg" Width="78" Height="100"
       HorizontalAlignment="Left" Grid.Row="0" Grid.Column="1"/>
    <TextBlock Foreground="White" FontSize="18" Text="姓名:"
           Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right"/>
    <TextBlock x:Name="lblName" Foreground="White" FontSize="18"
               Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left"
               Text="{Binding Name}"/>
    <TextBlock Foreground="White" FontSize="18" Text="位置:"
               Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right"/>
    <TextBlock x:Name="lblAddress" Foreground="White" FontSize="18"
               Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left"
               Text="{Binding Address}"/>
</Grid>

指定数据源,注意这里是创建一个User的实例并赋值后,把user实例绑定到了TextBlock的DataContext上,而不是向之前我们所做的示例中那样,直接指定Text属性:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    User user = new User();
    user.Name = "TerryLee";
    user.Address = "中国 天津";

    lblName.DataContext = user;
    lblAddress.DataContext = user;
}

运行示例后,可以看到:

TerryLee_Silverlight2_0055

上面这种数据绑定模式,只是显示数据而不对数据做任何修改,默认的绑定模式是一次绑定OneTime。

单向绑定示例

如果需要在数据源发生变化时能够通知UI进行相应的更新,即使用单向绑定OneWay或者双向绑定TwoWay,则业务实体需要实现接口INotifyPropertyChanged。在本示例中,我们加上一个更新按钮,当单击按钮时更新user实例的属性值,会看到界面上的数据也会发生变化。

修改一下User类,使其实现INotifyPropertyChanged接口。

public class User : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _name;
    public string Name
    {
        get { return _name; }
        set 
        {
            _name = value;
            if(PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Name"));
            }
        }
    }

    private string _address;
    public string Address
    {
        get { return _address; }
        set 
        {
            _address = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Address"));
            }
        }
    }
}

修改数据绑定模式,使用单向绑定OneWay模式,如{Binding Address, Mode=OneWay}

<Grid x:Name="LayoutRoot" Background="#46461F">
    <Grid.RowDefinitions>
        <RowDefinition Height="160"></RowDefinition>
        <RowDefinition Height="40"></RowDefinition>
        <RowDefinition Height="40"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="150"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Image Source="terrylee.jpg" Width="78" Height="100"
       HorizontalAlignment="Left" Grid.Row="0" Grid.Column="1"/>
    <Button x:Name="btnUpdate" Width="100" Height="40"
            Content="Update" Click="btnUpdate_Click"/>
    <TextBlock Foreground="White" FontSize="18" Text="姓名:"
           Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right"/>
    <TextBlock x:Name="lblName" Foreground="White" FontSize="18"
               Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left"
               Text="{Binding Name, Mode=OneWay}"/>
    <TextBlock Foreground="White" FontSize="18" Text="位置:"
               Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right"/>
    <TextBlock x:Name="lblAddress" Foreground="White" FontSize="18"
               Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left"
               Text="{Binding Address, Mode=OneWay}"/>
</Grid>

编写事件处理程序,为了演示把user声明为一个全局的,并在按钮的单击事件中修改其属性值:

public partial class Page : UserControl
{
    public Page()
    {
        InitializeComponent();
    }
    User user;
    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        user = new User();
        user.Name = "TerryLee";
        user.Address = "中国 天津";

        lblName.DataContext = user;
        lblAddress.DataContext = user;
    }

    private void btnUpdate_Click(object sender, RoutedEventArgs e)
    {
        user.Name = "李会军";
        user.Address = "China Tianjin";
    }
}

运行后如下所示:

TerryLee_Silverlight2_0056

单击Update按钮后:

TerryLee_Silverlight2_0057

绑定到列表

下面再看一个绑定到列表的简单例子,一般都会使用DataGrid或者ListBox来进行列表数据的显示。下面的示例我们显示一个文章列表:

<Grid Background="#46461F">
    <Grid.RowDefinitions>
        <RowDefinition Height="40"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Border Grid.Row="0" Grid.Column="0" CornerRadius="15"
            Width="240" Height="36" Background="Orange"
            Margin="20 0 0 0" HorizontalAlignment="Left">
        <TextBlock Text="文章列表" Foreground="White"
                   HorizontalAlignment="Left" VerticalAlignment="Center"
                   Margin="20 0 0 0"></TextBlock>
    </Border>
    <ListBox x:Name="PostList" Grid.Column="0" Grid.Row="1"
             Margin="40 10 10 10"
             HorizontalContentAlignment="Left" VerticalContentAlignment="Bottom"
             ItemsSource="{Binding Posts}">
    </ListBox>
</Grid>

编写一个简单的业务类:

public class Blog
{
    public List<String> Posts { get; set; }
}

初始化集合数据并进行绑定

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    Blog blog = new Blog();
    blog.Posts = new List<String>
    {
        "一步一步学Silverlight 2系列(10):使用用户控件",
        "一步一步学Silverlight 2系列(9):使用控件模板",
        "一步一步学Silverlight 2系列(8):使用样式封装控件观感",
        "一步一步学Silverlight 2系列(7):全屏模式支持"
    };

    PostList.DataContext = blog;
}

最终运行的结果如下所示:

TerryLee_Silverlight2_0058

当然我们也可以使用ListBox的ItemsSource属性进行绑定,

结束语

本文简单介绍了Silverlight 2中的数据绑定,你可以从这里下载文章示例代码。

下一篇:一步一步学Silverlight 2系列(12):数据与通信之WebClient

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
标签: Silverlight
posted @ 2008-03-08 23:48 TerryLee 阅读(29498) 评论(96) 编辑 收藏

 回复 引用 查看   
#1楼 2008-03-09 01:12 Jacky_Xu      
辛苦了。已经写两天了!都有点跟不上了! :)
 回复 引用 查看   
#2楼 2008-03-09 01:22 hxm      
http://silverlight.net/Learn/videocat.aspx?cat=2

how do i
silverlight 系列

 回复 引用   
#3楼 2008-03-09 06:47 过客007[未注册用户]
请问博主能否简单的举一个用linq取数据,再绑定显示到网页的例子?
 回复 引用   
#4楼 2008-03-09 06:56 过客007[未注册用户]
还有一个问题:看一些例子,好象一个silverlight应用最后只生成一个xap文件,是不是当需要多个xap文件时,需要在一个解决方案中建很多个项目?

对博主的劳动表示谢意.

 回复 引用 查看   
#5楼[楼主] 2008-03-09 12:24 TerryLee      
@Jacky_Xu
呵呵,不辛苦:)

 回复 引用 查看   
#6楼[楼主] 2008-03-09 12:24 TerryLee      
@hxm
:)

 回复 引用 查看   
#7楼[楼主] 2008-03-09 12:28 TerryLee      
@过客007
Silverlight不可以直接访问数据,你可以通过WCF、JSON、WebClient、WebRequest等方式取数据,并进行绑定,但是支持LINQ和LINQ to XML,后面会有相关的例子

 回复 引用 查看   
#8楼[楼主] 2008-03-09 12:29 TerryLee      
@过客007
现在看来只能这样去做,一个项目生成一个.xap文件

 回复 引用   
#9楼 2008-03-09 15:09 过客007[未注册用户]
谢谢楼主回答.

并且非常高兴的看到楼主的另一篇文章也完成了.

 回复 引用 查看   
#10楼[楼主] 2008-03-09 15:18 TerryLee      
@过客007
不用客气^_^

 回复 引用 查看   
#11楼 2008-03-10 22:09 守護~︶箬      
李老师,我调试的时候经常出现错误:文件“D:\Silverlight\ControlCustom\ControlCustom\ClientBin\ControlCustom.xap”正由另一进程使用,因此该进程无法访问该文件。

是哪个进程呢?

 回复 引用 查看   
#12楼[楼主] 2008-03-10 22:13 TerryLee      
@守護~︶箬
你把Web Development Server停止了,然后再调试,试试看

 回复 引用 查看   
#13楼 2008-03-10 23:09 ArthurHend      
请问private void UserControl_Loaded()这个是写在哪个文件中的?
 回复 引用 查看   
#14楼[楼主] 2008-03-10 23:19 TerryLee      
@ArthurHend
Page.xaml.cs文件中的,可以下载示例代码看一下:)

 回复 引用 查看   
#15楼 2008-03-10 23:27 ArthurHend      
@TerryLee
刚下来看过了!呵呵……我想问这个UserControl_Loaded是哪里自动生成的还是直接写的啊?

 回复 引用 查看   
#16楼[楼主] 2008-03-10 23:41 TerryLee      
在可以在XAML中编辑器中,未UserControl添加Loaded事件,按Tab键自动生成,也可以自己手动去写。可以看一下鼠标事件处理一文:
http://www.cnblogs.com/Terrylee/archive/2008/03/07/Silverlight2-step-by-step-part4-mouse-events-handle.html

 回复 引用   
#17楼 2008-03-12 22:15 高[未注册用户]
为什么我调试的时候,以本地的形式可以看,但是以http的时候,都是显示不出来?

 回复 引用 查看   
#18楼[楼主] 2008-03-13 12:58 TerryLee      
@高
可能是你的开发环境哪儿安装的有问题吧

 回复 引用 查看   
#19楼 2008-03-13 20:17 Zhuang miao      
你写的比我看的还快!是人是神??
 回复 引用 查看   
#20楼[楼主] 2008-03-13 20:20 TerryLee      
@Zhuang miao
是人,呵呵:)

 回复 引用 查看   
#21楼 2008-03-13 20:27 Zhuang miao      
@TerryLee
这两天一直在看你写的这个系列,真不错,就是看的有点慢~那个WCF是你翻译的吗?准备买本

 回复 引用 查看   
#22楼[楼主] 2008-03-13 20:35 TerryLee      
@Zhuang miao
不是,是张逸和徐宁翻译的:)

 回复 引用 查看   
#23楼 2008-03-20 12:23 张荣华      
@TerryLee
UserControl_Loaded()方法是不是需要在Page()中调用一下啊?

 回复 引用 查看   
#24楼[楼主] 2008-03-20 12:54 TerryLee      
@张荣华
在XAML中声明就可以了...

 回复 引用   
#25楼 2008-04-16 10:38 qingquan126778[未注册用户]
我在运行单向绑定示例时怎么出现了
“System.NullReferenceException”类型的异常 但未在用户代理码中进行处理
请问该如何解决呢?

 回复 引用 查看   
#26楼 2008-04-19 11:34 yww      
Silverlight不可以直接访问数据,你可以通过WCF、JSON、WebClient、WebRequest等方式取数据,并进行绑定,但是支持LINQ和LINQ to XML,后面会有相关的例子
--这个后面的例子在哪里?

另外,习惯了DataGrid和GridView的asp.net developer, 似乎在这个grid和ListBox 的例子中中找不到Header,TemplateColumn等概念。如何绑定一个常见的数据表格呢?

 回复 引用   
#27楼 2008-04-22 16:33 tiany[未注册用户]
能说一下类在silverlight中是怎么引用的吗?怎么在按钮单击事件不能创建类的实体?
 回复 引用   
#28楼 2008-05-18 01:50 xdpxdp[未注册用户]
看完基础系列,强悍,佩服啊,谢过
 回复 引用 查看   
#29楼 2008-06-02 21:01 tthxnz      
请问绑定的时候如何写格式化字符串呢
 回复 引用   
#30楼 2008-06-16 14:17 libo[未注册用户]
错误 1 “SilverlightApplication9.User”不实现接口成员“System.ComponentModel.INotifyPropertyChanged.PropertyChanged” 是怎么回事呢?
 回复 引用   
#31楼 2008-06-18 16:31 numbmeteor[未注册用户]
看完了基礎部分了,雖然由於基礎差沒能看出個所以然來但我是一個字母一個字母敲到VS裡的總還是有不少收穫的,在此感謝您無私的付出,您辛苦了。
 回复 引用   
#32楼 2008-06-18 20:58 EdisonDu[未注册用户]
@libo
我粗心的遇到你这样的问题.
将PropertyChangedEventHandler 写成
public event PropertyChangedCallback PropertyChanged;了..

 回复 引用   
#33楼 2008-06-30 21:33 botsing[未注册用户]
@libo
我也遇到了这样的问题,那个方法名必须要定义为PropertyChanged,大小写敏感,我就是把p小写了就出错了

 回复 引用 查看   
#34楼 2008-07-01 14:44 游民一族      
呵呵,遇到两个问题:
1. 把“public class User {...”前面的public去了绑定就报异常,很是奇怪,在同一个程序里public修饰符应该不是必需的吧!
2. 不能绑定到Page上,写了个LayoutRoot.DataContext = this,一运行就报错,郁闷

 回复 引用 查看   
#35楼[楼主] 2008-07-01 22:15 TerryLee      
@游民一族
1.必须为public

2.LayoutRoot.DataContext=this,搞明白这里的this是什么,呵呵

 回复 引用   
#36楼 2008-08-23 17:11 TM123456[未注册用户]
你好,我进行ListBox绑定那部分显示出来没有数据.
 回复 引用 查看   
#37楼[楼主] 2008-08-25 11:27 TerryLee      
@TM123456
能不能多提供点信息啊,有什么错误信息没?涉及到跨域调用问题没有?

 回复 引用   
#38楼 2008-09-17 14:47 tienhy[未注册用户]
TerryLee:您好,您的文章非常精彩,
问你一个问题:一步一步学Silverlight 2系列(11):数据绑定 绑定到列表。
为什么在beta2中,没有任何显示。

 回复 引用 查看   
#39楼[楼主] 2008-10-08 11:19 TerryLee      
@tienhy
报什么错误?

 回复 引用   
#40楼 2008-10-23 18:36 傻苗苗[未注册用户]
TerryLee,你好,
关于数据绑定的三种方式,我有个问题想请教:
我用的是数据库存取数据,并且页面上有一个SearchButton进行关键字查询,其间过程是通过WebService返回数据,并绑定在ListBox上。

现在的问题是这样的:
如果我在数据库中“手动”修改了某个数据的值,这时我想在前台表现出来,除了重新点击SearchButton进行再一次的数据查询外,能否用到你所述的OnyWay或者TwoWay来更新数据?如果可以,应该怎么用?
实体类实现了INotifyPropertyChanged接口后,是如何得到Notification的?

 回复 引用 查看   
#41楼[楼主] 2008-10-24 10:06 TerryLee      
@傻苗苗
这个有些难度,我不确定SQL Server 2005中有没有主动通知机制。

 回复 引用   
#42楼 2008-10-24 11:31 傻苗苗[未注册用户]
@TerryLee
--引用--------------------------------------------------
TerryLee: @傻苗苗
这个有些难度,我不确定SQL Server 2005中有没有主动通知机制。
--------------------------------------------------------
那么SQL Server 2008呢?

 回复 引用   
#43楼 2008-10-24 13:28 傻苗苗[未注册用户]
@TerryLee
呃,另外,Terry哥,我想问问看,有没有什么办法,能够让SilverLight进行实时的或者是间隔数秒的数据刷新(更新)呢?打个比方,如果我想用SilverLight做一个类似于NBA现场比分公告板,比分每隔两秒钟刷一次,能够做到吗?

谢谢Terry哥不吝赐教!~~

 回复 引用 查看   
#44楼[楼主] 2008-10-25 10:13 TerryLee      
@傻苗苗
这个是没有问题的,你可以用一个类似于Timer的东西来实现,隔段时间去主动调用Web Service来更新数据。

 回复 引用   
#45楼 2008-10-27 10:23 John.liu[未注册用户]
最近看了一下你写的关于silverlight 的文章,写的不错.不过能不能写一点关于silverligh调用wcf的一些例子.因为silverlight不支持直接进行数据访问.确实有点麻烦
 回复 引用   
#46楼 2008-10-27 17:28 傻苗苗[未注册用户]
@TerryLee
--引用--------------------------------------------------
TerryLee: @傻苗苗
这个是没有问题的,你可以用一个类似于Timer的东西来实现,隔段时间去主动调用Web Service来更新数据。
--------------------------------------------------------
Terry 哥,
今天做了个试验,你说的Timer方法确实是可行的,谢谢你!:)

有问题的话,我还会继续发问的哦!~

 回复 引用 查看   
#47楼[楼主] 2008-10-28 10:07 TerryLee      
@John.liu
WCF的调用我也写过一篇文章的。

 回复 引用 查看   
#48楼[楼主] 2008-10-28 10:08 TerryLee      
@傻苗苗
随时欢迎:)

 回复 引用   
#49楼 2008-10-29 10:29 傻苗苗[未注册用户]
@TerryLee
Terry哥,如果在SilverLight中使用WCF,是否可以实现双工通信?我的意思是:是否就可以实现数据一旦有了变更,WCF就会立刻通知到SilverLight,而不必再像我前面所用的Timer+WebService这样的方式来进行数据的实时刷新?

不好意思,其实我没有WCF的相关经验,所以可能提出来的问题都有可能是不正确的,还请Terry大哥多多包涵,谢谢

 回复 引用 查看   
#50楼[楼主] 2008-10-29 13:24 TerryLee      
@傻苗苗
现在Silverlight是支持WCF的双工通信的,在开发文档中有相关的示例。

 回复 引用 查看   
#51楼 2008-11-06 11:41 zhaoliang      
你好,求助
我在安装了blend2.5 之后再打开之前VS2008里面的项目,出现如下错误,不知道怎么解决

Error HRESULT E_FAIL has been returned from a call to a COM component.

多谢了!

 回复 引用 查看   
#52楼[楼主] 2008-11-06 20:27 TerryLee      
@zhaoliang
1. 你所说的之前VS2008的项目,是Silverlight哪个版本?

2. 微软好像发布了一个Blend的SP1包,好像是需要安装这个。

 回复 引用   
#53楼 2008-11-20 22:38 卅[未注册用户]
看完了基础篇!不说声感谢心里过意不去!谢谢!
 回复 引用 查看   
#54楼[楼主] 2008-11-20 23:42 TerryLee      
@卅
呵呵,太客气了:)

 回复 引用   
#55楼 2008-11-26 10:32 luolicun[未注册用户]
PropertyChanged
在那里绑定的?

 回复 引用 查看   
#56楼[楼主] 2008-12-01 00:05 TerryLee      
@luolicun
PropertyChanged是我自定义的一个方法而已:)

 回复 引用   
#57楼 2008-12-03 02:19 冻结2[未注册用户]
@luolicun
控件在绑定到数据源的时候,会判断该数据源时候继承了INotifyPropertyChanged这个接口,如果继承,该控件会把自己的更新UI处理函数注册到INotifyPropertyChanged接口的PropertyChanged方法里,

当数据源某个属性更改的时候,触发PropertyChanged这个事件,所以控件会自动更新UI

 回复 引用   
#58楼 2008-12-03 02:20 冻结2[未注册用户]
有错别字,重发:
@luolicun
控件在绑定到数据源的时候,会判断该数据源是否继承了INotifyPropertyChanged这个接口,如果继承,该控件会把自己的更新UI处理函数注册到INotifyPropertyChanged接口的PropertyChanged事件里,

当数据源某个属性更改的时候,触发PropertyChanged这个事件,所以控件会自动更新UI

 回复 引用   
#59楼 2008-12-04 14:11 garyzhang2681[未注册用户]
辛苦了。写的很好,很详细,很适合初学者啊。
问一下,列表更新怎么处理啊,

 回复 引用 查看   
#60楼[楼主] 2008-12-08 10:51 TerryLee      
@garyzhang2681
列表更新重新设置ItemsSource啊

 回复 引用   
#61楼 2008-12-28 15:46 zhlan[未注册用户]
请问一下 是不是每用一个silverlight页面必须建立一个silverlight工程,那样的话在我们目前的项目里面一般都有很多个页面 如果都用silverlight做的话那岂不是很不现实啊
 回复 引用 查看   
#62楼[楼主] 2009-01-04 11:27 TerryLee      
@zhlan
不是的,我有一篇文章《在Silverlight 2中切换用户控件》专门写这个问题,你可以参考一下。

 回复 引用   
#63楼 2009-02-20 16:35 Jimmy.Yang[未注册用户]
能否举例一个TwoWay的代码示例,想了半天,觉得凡是用TwoWay的地方,应该OneWay也能搞定?比如“显示书籍的剩余数量时用TwoWay模式”这里,只要有用户点击还书按钮了,代码一更新"书的数量",book实体集合肯定有变化,一旦变化,按照OneWay的机制,所有用OneWay绑定的控件,自然就变化了,所以不太理解TwoWay在实际开发,应该用在哪里?
 回复 引用 查看   
#64楼 2009-04-28 15:48 睡の虫      
不能直接绑XML啊??
 回复 引用   
#65楼 2009-04-28 17:18 LoveSilverlight[未注册用户]
错误 1 “SilverlightApplication9.User”不实现接口成员“System.ComponentModel.INotifyPropertyChanged.PropertyChanged” 是怎么回事呢?

解答:
在User.cs类文件中,添加
using System.ComponentModel;

然后在定义User类时,实现INotifyPropertyChanged 接口:

public class UserClass : INotifyPropertyChanged
{
,,,,,,,,
}

 回复 引用 查看   
#66楼 2009-05-03 20:12 灵魂架构师      
迟到了
不过真的很好!

 回复 引用   
#67楼 2009-05-05 15:41 afaand20
Error 1 The type or namespace name 'List' could not be found (are you missing a using directive or an assembly reference?) 。我在做绑定到列表出现了这个错误,是不是没有引用什么呀?
 回复 引用   
#68楼 2009-05-20 10:38 傻猪[未注册用户]
老师你好,我学习单向绑定的时候
方法UserContro_Loaded里
lblAddress.DataContext = user;
这里抛出个异常 取不到lblAddresss的值 异常是:值不在预期的范围内。
上面lblName的值取的到 如果注释掉lblName.DataContext = user;
lblAddress的值也取的到~ 求助下~

 回复 引用   
#69楼 2009-05-20 11:17 傻猪[未注册用户]
找到错误了~命名空间
 回复 引用 查看   
#70楼 2009-06-19 11:36 笨笨猪      
会军,关于图片只能放在clientBin下吗?能否自定义配置?还有就是要把sliverlight挂到一个网站,必须建立一个叫clientBin的文件夹吗?能否自定义名字?谢谢
 回复 引用 查看   
#71楼 2009-06-19 13:39 笨笨猪      
基础终于看完了,谢谢会军:)
 回复 引用 查看   
#72楼 2009-08-18 10:05 网中漫步      
我用三层架的一个框架,为什么我在SilverlightApplication1中的Bin目录下面引用BLL层和Model层的dll文件会报错?

我是想从数据库里面读出数据出来赋值list<blog>,但是我怎么引用都不行,后来想直接放到SilverlightApplication1下面建类的,但是没有命名空间System.Data.SqlClient,访问不了数据库,哪个知道怎么解决啊,谢过了~

 回复 引用   
#73楼 2009-08-28 22:31 龙人云[未注册用户]
错误 1 “SilverlightApplication9.User”不实现接口成员“System.ComponentModel.INotifyPropertyChanged.PropertyChanged” 是怎么回事呢?

解答:PropertyChangedEventHandler要指定为public,用private就会出现上面的错误

 回复 引用   
#74楼 2009-11-09 17:18 liaoxin[未注册用户]
一直跟者你学习 非常感谢
silverlight的中文资料 发现很少的
你写的非常好 基础 实用 非常感谢!!

 回复 引用 查看   
#75楼 2009-11-16 15:09 忘天      
问个问题不知道楼主什么时候能看到
在3.0里INotifyPropertyChanged还有这个接口吗?还是换成其他名称了,我没找到。请您指教

 回复 引用 查看   
#76楼 2009-11-16 15:20 忘天      
啊,不好意思,忘引用System.ComponentModel了
 回复 引用 查看   
#77楼 2010-01-15 22:18 virus      
SL3的数据库交互方面,除了wcf、ado.net data service还有就是RIA service,可是ria service好像目前是beta version,是不是还不能用于商业开发呢?还是说最好不要用,那样的话,就是肯定选择wcf了吗?相比ado.net有什么好处呢?不支持除mssql之外的数据库,而且可以提供一些意见吗?我们公司最近在开发一个电子商务平台,如何选择数据库操作这一层呢?就是sl3的数据库操作?谢谢
 回复 引用 查看   
#78楼 2010-01-15 22:18 virus      
msn:jorden008@hotmail.com

thank you very much!!

 回复 引用 查看   
#79楼 2010-01-19 11:55 Jackey_shao      
@All
我问一下,我的vs 2008 里点击新建项目后 选择silverlight 但在temple里面没有silverlight user control项目模板呀?知道怎么可以显示出来吗?这个是什么原因导致的?

 回复 引用 查看   
#80楼 2010-03-19 13:41 努力前进中      
一直跟者你学习 非常感谢
silverlightf1的中文资料 发现很少的
你写的非常好

 回复 引用 查看   
#81楼 2011-08-29 12:53 李澈義      
老师你好! 我想问下
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
User user = new User();
user.Name = "输入姓名";
user.Sex = "输入性别";
user.Age = "输入年龄";

lblName.DataContext = user;
lblSex.DataContext = user;
lblAge.DataContext = user;
}
这么写的话 运行后不出来结果的?
但是在在mainpage里面写就可以? 这是为什么 求解 谢谢

 回复 引用 查看   
#82楼 2011-09-21 16:58 困了      
Text="{ Binding Name, Mode=OneWay}"
这句话什么意思?我在xaml里写Binding Name 没有这个?

 回复 引用 查看   
#83楼 2011-11-24 23:56 yu jin      
谢谢,看来我晚来博客园了! 楼主辛苦!
 回复 引用 查看   
#84楼 2011-11-28 17:44 dchly      
楼主非常感激,接二连三的看完了基础篇,很有收获,谢谢