【问题标题】:Problem with Silverlight bindingSilverlight 绑定问题
【发布时间】:2011-07-20 08:33:01
【问题描述】:

我有以下 XAML:

 ...
 <ListBox Name ="RoomsListBox" Height="100"
 HorizontalAlignment="Left" Margin="12,41,0,0"
 VerticalAlignment="Top" Width="120"></ListBox>
 ...   

还有下面的C#代码:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
     RoomsListBox.ItemsSource = new[] { new { Name = "First1" },
       new { Name = "First2" } };
     RoomsListBox.DisplayMemberPath = "Name";
}

问题是我的 ListBox 有项目但它们是空的。为什么我没有看到“First1”和“First2”?

【问题讨论】:

    标签: c# .net silverlight binding listbox


    【解决方案1】:

    这里的问题不在于绑定、ItemTemplate 和更改通知。这是您使用的匿名类型造成的。尝试为您的项目使用类或结构

    public class Item
    {
        public string Name { get; set; }
    }
    
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        RoomsListBox.ItemsSource = new[] { 
                                            new Item { Name = "First1" },
                                            new Item { Name = "First2" }};
        RoomsListBox.DisplayMemberPath = "Name";
    }
    

    您的 xaml 保持不变,或者您可以根据需要为 ListBox 项定义一个 DataTemplate。请注意,您不能同时设置ItemTemplateDisplayMemberPath(其中一个必须为空)。此外,请确保代表您的项目的类必须是公开的。

    希望这会有所帮助:)

    【讨论】:

    • 这真的很有帮助。谢谢你。我已经使用了一个单独的类,但问题仍然存在。这是因为匿名类和我新创建的类是私有的而不是公共的。我只是想知道为什么没有警告或异常?
    • 这里的问题是数据绑定机制无法访问你的类,所以它对它一无所知(也不知道如何绑定它)!缺少警告、异常以及最重要的是“调试”是 DataBinding 的一般问题!这将随着 Silverlight 5 的改变而改变,它将引入“DataBinding Debugging”,这非常酷:)
    • 感谢有关 Silverlight 5 的解释和好消息 :)
    • Silverlight 5 实际上有很多好东西,您可以在观看Scott Guthrie's Keynote for the Silverlight FireStarter 时找到更多相关信息
    【解决方案2】:

    只是一个想法..

    您是否尝试过在 XAML 中设置 DisplayMemberPath 属性?调用顺序可能有问题。

    【讨论】:

      【解决方案3】:

      您必须将 ListBox 上的 DisplayMemberPath 属性设置为 Name

      接下来,您可能需要考虑为您的项目创建一个DataTemplate 以获得更多控制权:

      <ListBox x:Name ="RoomsListBox" Height="100"
       HorizontalAlignment="Left" Margin="12,41,0,0"
       VerticalAlignment="Top" Width="120">
           <ListBox.ItemTemplate>
                <DataTemplate>
                     <StackPanel>
                         <TextBlock Text="{Binding Name}"/>
                     </StackPanel>
                </DataTemplate>
           </ListBox.ItemTemplate>
      </ListBox>
      

      有关更多信息,请参阅本教程:http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-5-using-the-listbox-and-databinding-to-display-list-data.aspx

      【讨论】:

      • 抱歉,错过了,正在 xaml 中寻找它。为 DataTemplate 添加了一个示例,您可以按原样使用,我认为这是一个更好的解决方案!
      • 我更改了我的 XAML。但我仍然有一个包含空项目的列表。而且我不明白这怎么可能。默认 ToString() 方法从不返回空字符串。
      • 更多。我的列表中也没有任何 TextBlock。
      • 奇怪...试着删除一些东西,直到你发现哪里出错了。那么,如果您放入 XAML 中硬编码的项目,没有 datatemplate 或 displaymemberpath 等,会发生什么。
      【解决方案4】:

      我希望你在你的 xaml 中定义你的绑定,例如在你的代码隐藏中你为你的列表框的项目定义一个属性。

      示例:(xaml)

      <ListBox Name ="RoomsListBox" 
               ItemsSource="{Binding MyItems}" 
               Height="100" 
               HorizontalAlignment="Left" 
               Margin="12,41,0,0" 
               VerticalAlignment="Top" 
               Width="120" />
      

      示例:(代码隐藏中的 C#)

      //...
      private ObservableCollection<string> _myItems;
      
      public ObservableCollection<String> MyItems 
      {
          get 
          {
              return _myItems ?? (_myItems = new ObservableCollection<string> { "FirstItem", "SecondItem"});
          }
          set
          {
              _myItems = value;
          }
      }
      

      正如 ChrisF 所说,您可以使用 INotifiyPropertyChanged 接口,在那里您可以在属性的设置器中引发 PropertyChanged 事件。

      见 --> http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

      【讨论】:

      • 我已经删除了我的答案,因为经过反思(通过评论),我认为这与这种情况无关。当然,除非 OP 按照这些思路重写他的代码。
      猜你喜欢
      • 2011-07-19
      • 2011-08-15
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多