从反序列化的 XML 更新 ListBox.ItemsSource 并刷新 WPF 中的 ListBox

问题描述 投票:0回答:1

首先我想向大家打个招呼,因为这是我在这里发的第一篇文章。

这是我在 WPF 中的第一个项目,我的 ListBox 中的项目几乎没有问题 - 当我从反序列化 XML 将它们添加为 Listbox.ItemsSource 时,它们没有刷新。我已经实现了 INotifyPropertyChanged 接口,但仍然缺少一些东西。

这是列表框声明:

<ListBox x:Name="lstbRealmlist" Grid.ColumnSpan="2" Grid.Row="1" Width="160" Height="220" Margin="10,0"  HorizontalAlignment="Left" VerticalAlignment="Center" ItemContainerStyle="{StaticResource ListboxItemStyle}">
                <ListBox.Background>
                    <ImageBrush ImageSource="/SunwellLauncher;component/Images/content-bg.jpg" Stretch="UniformToFill" TileMode="None" />
                </ListBox.Background>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Border BorderThickness="1" BorderBrush="#FFBA7C0E" Margin="1" CornerRadius="3" >
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="2*"/>
                                    <RowDefinition Height="1*"/>
                                </Grid.RowDefinitions>
                                <Label Content="{Binding name}" FontSize="16"/>
                                <Label Content="{Binding website}" Grid.Row="1"/>
                            </Grid>
                        </Border>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

Realmlist 和 Realm 类:

namespace SunwellLauncher
{
[XmlRoot("Realmlists"), Serializable]
public class Realmlists : INotifyPropertyChanged
{
    private ObservableCollection<Realm> realm;
    public event PropertyChangedEventHandler PropertyChanged;

    [XmlElement("Realm")]
    public ObservableCollection<Realm> Realm
    {
        get { return realm; } 
        set 
        {
            realm = value;
            OnPropertyChanged("Realm");
        }
    }

    #region Constructors

    public Realmlists()
    {
    }
    public Realmlists(ObservableCollection<Realm> value)
    {
        this.realm = value;
    } 
    #endregion
    
    protected void OnPropertyChanged(string propName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propName));
        }
    }
}

public class Realm
{
    [XmlElement("name")]
    public string name { get; set; }
    [XmlElement("address")]
    public string address { get; set; }
    [XmlElement("website")]
    public string website { get; set; }
}
}

以及将 XML 反序列化为 Realmlists 对象并填充 ListBox 的方法:

public void ListItemsAddFromXML(XDocument doc)
    {
        XmlSerializer reader = new XmlSerializer(typeof(Realmlists));
        Realmlists realmlists = (Realmlists)reader.Deserialize(doc.CreateReader());
        lstbRealmlist.ItemsSource = realmlists.Realm;
    }

在应用程序启动时,此方法从 XML 文件填充 ListBox,并且工作正常,但问题是当我尝试使用它来更新它时 - 没有任何反应。在其他窗口中,我正在更新该 XML 文件,等到更改(XMLsave)并再次运行此方法以更新列表框。当通过委托完成 xml 更改时,从 FileSystemWatcher 调用方法。

private void CreateWatcher()
    {
        watcher = new FileSystemWatcher();
        watcher.Filter = "Realmlists.xml";
        watcher.Changed += watcher_FileChanged;
        watcher.Path = mw.path;
        watcher.EnableRaisingEvents = true;
    }
    void watcher_FileChanged(object sender, FileSystemEventArgs e)
    {
        Dispatcher.Invoke(DispatcherPriority.Normal, new MainWindow.ListItemsAdd(mw.ListItemsAddFromXML), doc);
        
        watcher.EnableRaisingEvents = false;
        watcher.Created -= watcher_FileChanged;
        watcher.Dispose();
    }

我还将 Realmlists 定义中的 List 更改为 ObservableCollection。

我哪里做错了?

c# wpf xml
1个回答
1
投票

您需要使用 Xaml 中的 Binding 表达式将 Listbox ItemSource 绑定到 Realmlist。当前您正在实例化列表并在后面的代码中设置 ItemSource。

另请参阅约束声明概述

© www.soinside.com 2019 - 2024. All rights reserved.