none
SilverLight绑定问题 RRS feed

  • 问题

  • 请问对SilverLight的Datacontext进行绑定是不是有问题啊?
    在SilverLight项目中,我新建了一个SilverLight用户控件,然后在MainPage中去直接调用这个控件的时候,在这个控件的Loaded事件中对Datacontext进行绑定,得到的结果是正确的,修改页面上的数据也会对数据源进行更新
    <controls:ucNewUserControl/>

    但是如果使用一个Frame来导航到这个控件上时,Datacontext的绑定却是不对的,在页面上显示的数据根本不是绑上去的数据,而且修改页面上的数据对绑上去的数据源完全是没有任何更新的
    • 已移动 mldark 2010年2月1日 14:28 (发件人:Visual C#)
    2010年2月1日 8:47

答案

  • 兄弟!!

    改为this.DataContext=factory;你试试就可以了!


    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年3月12日 10:16
    版主

全部回复

  • 可能原因是 Loaded 事件没有被激发。写在 Page 的 Loaded 或者控件的 Activated 事件中看看。
    Mark Zhou
    2010年2月1日 9:34
  • 有设断点跟进去看的, Loaded 事件是肯定被触发了的,就是显示不出来
    SILVERLIGHT的数据绑定经常显示不出来,很奇怪,怀疑有BUG
    2010年2月1日 11:46
  • 用户控件代码:
    <UserControl xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"    x:Class="UserControls.ucNewFactory" Loaded="UserControl_Loaded">
       <controls:TabControl x:Name="tcMain">
           <controls:TabItem x:Name="tiNewFactory">
               <Grid>
                 <StackPanel Grid.Row="1">
                     <TextBox Name="tbFactoryCode"  Text="{Binding FactoryCode, Mode=Twoway}" />
                 </StackPanel>
              </Grid>
          </controls:TabItem>
       </controls:TabControl>
    </UserControl>
    后台代码:
    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        Base_Factory factory = new Base_Factory();
        factory.FactoryCode = "Factory";
        tiNewFactory.DataContext = factory;
    }

    在MainPage中直接调用<controls:ucNewFactory/>时可以正常的对factory的值显示与更新,
    但是使用Frame控件<navigation:Frame Name="navFrame"/>,在页面后台代码导航
        public partial class MainPage : UserControl
        {
            public MainPage()
            {
                InitializeComponent();
            }

            private void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                //navFrame.Navigate(new Uri("/UserControls/ucNewFactory.xaml", UriKind.Relative));
                navFrame.Source = (new Uri("/UserControls/ucNewFactory.xaml", UriKind.Relative));
            }
        }
    用以上两种方式导航在页面上都不显示factory的值,修改tbFactoryCode的值对数据源也不会更新。。。
    <TextBox Name="tbFactoryCode"  Text="{Binding FactoryCode, Mode=Twoway}" />
    奇怪的是这里的Text命名已经绑定了FactoryCode,调试跟踪下发现tbFactoryCode.Text也确实变成了我输入的值,
    但是tiNewFactory.DataContext里面的FactoryCode却仍然是最初的"Factory"没有更新。。。
    使用<controls:ucNewFactory/>调用则没有任何问题tbFactoryCode.Text改变会更新tiNewFactory.DataContext。。。

    2010年2月2日 2:50
  • 你好,
      
          我拷贝了你的代码进行测试,数据源正常改变了啊。 
     
          是不是有些地方有所遗漏呢? 还是说你本地的代码有哪里不一样。 
      
          你是如何跟踪值的? 他们的target是同一个引用类型,也就是指向同一块内存的,不应该的都的值不同的。
        
         
    2010年2月2日 8:15
  • 非常感谢版主的测试!

    上面的代码确实是精简过的,因为原始代码太长了,就只把出问题的地方贴出来了。。。

    我是设断点跟踪进去看值的,通过监视窗口看到tbFactoryCode.Text的值改变了,而tiNewFactory.DataContext里面的FactoryCode仍然保持不变的

    这里不能贴图的?或者版主你可以加下我QQ99772506,我截图给你看下?
    2010年2月3日 1:05
  • 兄弟!!

    改为this.DataContext=factory;你试试就可以了!


    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年3月12日 10:16
    版主
  • 试试回我QQ,我加了你。叫天使坠
    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年3月12日 10:17
    版主