Проблема с привязкой данных к ListBox в WP7, который не отображает связанное содержимое - PullRequest
0 голосов
/ 18 февраля 2012

У меня есть привязка данных в ListBox, привязанная к коллекции ObservableCollection.Отладка во время выполнения показывает, что в ObservableCollection есть элементы , и они не равны NULL.Мой код выглядит нормально, но по какой-то причине в моем ListBox ничего не отображается.Это определенно работало ранее, однако это больше не так - и я не могу понять, почему.Я изучил предыдущие версии кода и не обнаружил различий, которые могли бы на это повлиять - мелкие вещи, такие как Width = "Auto" и т. Д.

Я основал свой код на примере, найденном здесь:

http://msdn.microsoft.com/en-us/library/hh202876.aspx

Итак, мой код:

XAML:

<phone:PhoneApplicationPage 
x:Class="MyNamespace.MyItemsListPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True">

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <TextBlock Grid.Row="0" x:Name="PageTitle" Text="MyPageTitle" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <!-- Bind the list box to the observable collection. -->
        <ListBox x:Name="myItemsListBox" ItemsSource="{Binding MyItemsList}" Margin="12, 0, 12, 0" Width="440">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid HorizontalAlignment="Stretch" Width="440">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="80" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <TextBlock
                            Text="{Binding MyItemNumber}"
                            FontSize="{StaticResource PhoneFontSizeLarge}"
                            Grid.Column="0"
                            VerticalAlignment="Center" 
                            Margin="0,10"
                            Tap="TextBlock_Tap"/>
                        <TextBlock
                            Text="{Binding MyItemName}"
                            FontSize="{StaticResource PhoneFontSizeLarge}"
                            Grid.Column="1"
                            VerticalAlignment="Center"
                            Margin="0,10" 
                            Tap="TextBlock_Tap" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Grid>
</phone:PhoneApplicationPage>

C #:

namespace MyNamespace
{
public partial class MyItemsListPage : PhoneApplicationPage, INotifyPropertyChanged
{
    private static ObservableCollection<MyItem> _myItemsList;
    private ObservableCollection<MyItem> MyItemsList
    {
        get
        {
            return _myItemsList;
        }
        set
        {
            if (_myItemsList!= value)
            {
                _myItemsList= value;
                NotifyPropertyChanged("MyItemsList");
            }
        }

    }

    public MyItemsListPage ()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        HelperClass helper = new HelperClass();
        MyItemsList = helper.GetItems(this.NavigationContext.QueryString["query"]);
        base.OnNavigatedTo(e); // Breakpoint here shows "MyItemsList" has MyItem objects in it.
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    // Used to notify Silverlight that a property has changed.
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
}
}

Класс Helperразъем для моей локальной базы данных только для чтения на устройстве.Он возвращает ObservableCollection<MyItem>:

public ObservableCollection<MyItem> GetItems(string itemName)
    {
        // Input validation etc.
        // Selecting all items for testing
        var itemsInDB =
            from MyItem item in db.Items
            select item;
        return new ObservableCollection<MyItem>(itemsInDB);
    }

И, наконец, класс MyItem:

[Table]
public class MyItem: INotifyPropertyChanged, INotifyPropertyChanging
{
    private int _myItemId;

    [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
    public int MyItemId
    {
        ...
    }

    private string _myItemName;

    [Column(CanBeNull = false)]
    public string MyItemName
    {
        get
        {
            return _myItemName;
        }
        set
        {
            if (_myItemName!= value)
            {
                NotifyPropertyChanging("MyItemName");
                _myItemName= value;
                NotifyPropertyChanged("MyItemName");
            }
        }
    }

    private int _myItemNumber;
    [Column]
    public int MyItemNumber
    {
        get
        {
            return _myItemNumber;
        }
        set
        {
            if (_myItemNumber!= value)
            {
                NotifyPropertyChanging("MyItemNumber");
                _myItemNumber= value;
                NotifyPropertyChanged("MyItemNumber");
            }
        }
    }
    // Other properties, NotifyPropertyChanged method, etc...
}

Это довольно сложно, так как моя DataBinding в другом месте приложения работает отлично, поэтому яПонятия не имею, почему я не могу заставить это работать.

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Проблема заключалась в том, что моя коллекция ObservableCollection была private.Изменение его на модификатор доступа public позволило моему ListBox отображать содержимое:

public ObservableCollection<MyItem> MyItemsList
0 голосов
/ 18 февраля 2012

Просто, что вы привязываетесь к свойствам, названным неправильно:

Text="{Binding ItemName}" должно быть Text="{Binding MyItemName}"

Обратите внимание, что вы оставили "Мой"

...