Silverlight绑定问题

时间:2011-03-22 09:59:54

标签: c# .net silverlight binding listbox

我有以下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”?

4 个答案:

答案 0 :(得分: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(一个必须为null)。此外,请确保代表您的项目的类必须是公开的。

希望这会有所帮助:)

答案 1 :(得分:0)

您必须将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

答案 2 :(得分:0)

只是一个想法..

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

答案 3 :(得分:0)

我希望您在xaml中定义绑定,例如在Code-Behind中为列表框的项目定义属性。

示例:(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接口,你可以在你的属性的setter中引发PropertyChanged事件。

参见 - &gt; http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx