开发者

Problem with Silverlight binding

开发者 https://www.devze.com 2023-02-19 02:03 出处:网络
I have the following XAML: ... <ListBox Name =\"RoomsListBox\" Height=\"100\" HorizontalAlignment=\"Left\" Margin=\"12,41,0,0\"

I have the following XAML:

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

And the following C#-code:

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

The problem is that my ListBox have items but t开发者_StackOverflow中文版hey are empty. Why I don't see "First1" and "First2" instead?


The issue here isn't with the bindings nor the ItemTemplate nor the change notification. It's the Anonymous Type you're using that's causing it. try using a class or struct for your items

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";
}

your xaml stays the same, or you can define a DataTemplate for the ListBox items if you want. Note that you can't set both the ItemTemplate and DisplayMemberPath at the same time (one has to be null). Also, make sure that the class representing your items has to be public.

Hope this helps :)


Just a thought..

Have you tried settings the DisplayMemberPath property in XAML? There might be an issue with the order of calls.


You have to set DisplayMemberPath property on your ListBox to Name.

Moving forward you might want to consider creating a DataTemplate for your items to have more control:

<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>

See this tutorial for more info: http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-5-using-the-listbox-and-databinding-to-display-list-data.aspx


I would prefer that you define your binding in your xaml and for example in your Code-Behind you define a property for the items of your listbox.

Example: (xaml)

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

Example: (C# in your code-behind)

//...
private ObservableCollection<string> _myItems;

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

Like ChrisF said you could use the INotifiyPropertyChanged Interface, there you would raise the PropertyChanged event in the setter of your property.

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

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号