Список привязан к ObservableCollection (в VB.NET и Silverlight) - PullRequest
0 голосов
/ 09 января 2011

Извините, если это повторяющийся вопрос. Есть довольно много вопросов по этой теме, но я не могу понять это. Я пытаюсь привязать список к ObservableCollection и обновлять список при добавлении элементов в коллекцию.

У меня есть класс с именем CollectionOfBlogs:

Public Class CollectionOfBlogs
    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler _
    Implements INotifyPropertyChanged.PropertyChanged

    Public Sub New(ByVal name As String)
        Me.FullName = name
    End Sub

    Private _FullName As String
    Public Property FullName() As String
        Get
            Return _FullName
        End Get
        Set(ByVal value As String)
            _FullName = value
            NotifyPropertyChanged("FullName")
        End Set
    End Property

    Public Sub NotifyPropertyChanged(ByVal propertyName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub

End Class

Затем другой класс, где я настраиваю ObservableCollection CollectionOfBlogs (выше) и подпрограмму для добавления элементов в коллекцию:

Public Class ITRSBlogs

    Public blogNamesList As New ObservableCollection(Of CollectionOfBlogs)

    Public Sub addBlog(ByVal FullName as String)
        blogNamesList.Add(New CollectionOfBlogs(FullName))
    End Sub

End Class

Я связываю список со списком blogNamesList в классе ITRSBlogs (выше) из события моей главной страницы:

Dim blogClass As New ITRSBlogs

Me.BloggingMenuListBox.ItemsSource = blogClass.blogNamesList

Вот XAML моего списка. Это связано в коде, а не в XAML (просто подумал, что я должен упомянуть об этом).

<ListBox Name="BloggingMenuListBox"/>

Перед привязкой коллекции к списку я загружаю коллекцию с элементами из базы данных, и они отображаются в списке просто отлично. Эти 2 подпрограммы, приведенные ниже, на самом деле также относятся к классу ITRSBlogs, и я вызываю FillBlogLists из события загрузки моих страниц.

Public Sub FillBlogLists()
    Dim query = theContext.GetBlogsOrderedByNameQuery
    theContext.Load(query, AddressOf OnBlogsLoaded, Nothing)
End Sub

Private Sub OnBlogsLoaded(ByVal lo As LoadOperation(Of Blog))
    blogList.Clear()
    For Each s In lo.AllEntities
        blogList.Add(CType(s, Blog))
    Next
    For Each item In blogList
        blogNamesList.Add(New CollectionOfBlogs(item.FullName))
    Next
End Sub

Помимо этого, у меня есть простое текстовое поле и кнопка на странице. Когда имя вводится в текстовое поле и нажимается кнопка, я вызываю подпрограмму addBlog (передавая имя из текстового поля) в классе ITRSBlogs (немного резервирую страницу), чтобы добавить элемент в коллекцию.

Проблема в том, что когда я добавляю элемент в коллекцию, список не обновляется. Я новичок в Observable Collections (и многих других вещах :), так что, возможно, я просто действительно здесь. Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

1 голос
/ 09 января 2011

Код, который вы разместили, выглядит хорошо для меня.Я тиражировал ваш код (в C #, но я старался максимально приблизить его к вашему коду), и он просто работал.Единственный код, который вы не опубликовали - это обработчик события кнопки Add.Вы проверили, что он действительно вызывается и что в коллекцию добавлен новый элемент?

В любом случае, вот мой код, может быть, вы сможете определить разницу между этой версией и вашей версией:

CollectionOfBlogs.cs:

public class CollectionOfBlogs : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _FullName;
    public string FullName
    {
        get
        {
            return this._FullName;
        }
        set
        {
            if (this._FullName != value)
            {
                this._FullName = value;
                this.OnPropertyChanged("FullName");
            }
        }
    }

    public CollectionOfBlogs(string name)
    {
        this._FullName = name;
    }

    public virtual void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public override string ToString()
    {
        return this._FullName;
    }

}

ITRSBlogs.cs:

public class ITRSBlogs
{
    public ObservableCollection<CollectionOfBlogs> blogNamesList = new ObservableCollection<CollectionOfBlogs>();

    public void AddBlog(string fullName)
    {
        this.blogNamesList.Add(new CollectionOfBlogs(fullName));
    }

    public void FillBlogList()
    {
        this.blogNamesList.Clear();
        this.AddBlog("First blog");
        this.AddBlog("Another blog");
    }
}

MainWindow.xaml:

<Window x:Class="ObservableRefreshDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
  <Grid>
    <ListBox Name="BloggingMenuListBox"/>
    <Button Content="Add" Height="23" HorizontalAlignment="Left" Margin="154,276,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="12,276,0,0" Name="txtName" VerticalAlignment="Top" Width="120" />
  </Grid>
</Window>

MainWindow.xaml.cs:

public partial class MainWindow : Window
{

    private ITRSBlogs blogClass = new ITRSBlogs();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.blogClass.FillBlogList();
        this.BloggingMenuListBox.ItemsSource = this.blogClass.blogNamesList;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        this.blogClass.AddBlog(this.txtName.Text);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...