none
win 8 app中listbox重新绑定数据源出错?求救!! RRS feed

  • 问题

  • 我在xaml中这样定义了一个listbox

    <ListBox x:Name="listLanguages" Margin="30 0" ScrollViewer.VerticalScrollBarVisibility="Auto"
                             SelectionChanged="listLanguages_SelectionChanged">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid Height="40" MinWidth="800" VerticalAlignment="Center" HorizontalAlignment="Center">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="50*"/>
                                        <ColumnDefinition Width="50*"/>
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Text="{Binding LanguageName}" FontSize="28" Foreground="Black" VerticalAlignment="Center"
                                           HorizontalAlignment="Left" Margin="20 0 0 0"/>
                                    <Image Source="/Assets/Images/Icons/check.png" Visibility="{Binding LanguageVisibility}" VerticalAlignment="Center"
                                             HorizontalAlignment="Right" Grid.Column="1" Stretch="None" Margin="0 0 10 0"/>
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

    现在绑定了数据源后,第二次再次绑定就错误,我先把原来的数据源清空,然后再次绑定数据源,到了这里就错误。

    下面是后台代码 LanguageInfos = new ObservableCollection<LanguageInfo>();if (m_strLanguage.Equals("ch-CN"))
                {
                    LanguageInfos.Add(new LanguageInfo() { LanguageName = "简体中文", LanguageVisibility = "Collapsed" });
                    LanguageInfos.Add(new LanguageInfo() { LanguageName = "繁體中文", LanguageVisibility = "Collapsed" });

    } listLanguages.ItemsSource = null;//到这里就出错,这是为什么啊?
                listLanguages.ItemsSource = LanguageInfos;下面是错误提示:

    2013年3月26日 11:27

答案

  •   NotifyChanged(LanguageName); 这里错了  应该是   NotifyChanged("LanguageName");

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年3月29日 8:18
    版主

全部回复

  • 没有看到错误提示,是否发贴的时候漏了?

    不管怎么样,我测试了你的代码,并没有重现发生问题,所以我关心的是,肯定是有其他部分导致了问题,比如你的listLanguages_SelectionChanged 事件 在设置 ItemsSource = null 时候被触发,且有异常发生,你可以断点跟踪下。还有建议将比较完整的代码发出来。

    另外,我建议你直接设置 Visibility.Collapsed 枚举值,而不是用字符串给LanguageVisibility 属性赋值


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年3月27日 8:04
    版主
  • 我现在换了个方法,没有报错,当时没有看到我预期的结果,你帮忙看下,我是把Listbox的数据源从新得到,并修改其里面的内容,再重新赋给Listbox,但它并没有像我预期的那样从中文并英文。

    LanguageInfos = new ObservableCollection<LanguageInfo>();

                ObservableCollection<LanguageInfo> oldLanguageInfo = listLanguages.ItemsSource as  ObservableCollection<LanguageInfo>;

    if (oldLanguageInfo == null || oldLanguageInfo.Count <= 0)
                {
                    LanguageInfos.Add(new LanguageInfo() { LanguageName = "简体中文", LanguageVisibility = "Collapsed" });
                    LanguageInfos.Add(new LanguageInfo() { LanguageName = "繁體中文", LanguageVisibility = "Collapsed" });

    listLanguages.ItemsSource = LanguageInfos;

    }

    else

    {          if (m_strLanguage.Equals("en-US"))
                    {
                        oldLanguageInfo[0].LanguageName = "Simplified Chinese";
                        oldLanguageInfo[1].LanguageName = "Traditional Chinese";

                    }

             listLanguages.ItemsSource = oldLanguageInfo;

    }

    请教下这是为什么?

    2013年3月27日 10:32
  • 本身 ObservableCollection<LanguageInfo> 这个集合在集合元素增加或者减少时候会通知邦定区更新。但是他的LanguageInfo类型元素对象的属性变更的时候你是否NotifyPropertyChanged?

    也就是说,你的LanguageInfo类型需要实现INotifyPropertyChanged 接口,然后在LanguageName 属性的set方法中NotifyPropertyChanged  让邦定的UI去更新


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年3月29日 6:39
    版主
  • 实现了 INotifyPropertyChanged接口,以下是代码: public class LanguageInfo : INotifyPropertyChanged
        {
            private string languageName;
            public string LanguageName
            {
                get
                {
                    return languageName;
                }
                set
                {
                    if (value != languageName)
                    {
                        languageName = value;
                        NotifyChanged(LanguageName);
                    }
                }
            }

      public event PropertyChangedEventHandler PropertyChanged;
            public void NotifyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }

    2013年3月29日 7:59
  •   NotifyChanged(LanguageName); 这里错了  应该是   NotifyChanged("LanguageName");

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年3月29日 8:18
    版主
  • thank you ! Bob Bao
    2013年3月30日 5:49