まず、これが私の最初の投稿なので、皆さんに挨拶したいと思います。
これはWPFでの最初のプロジェクトであり、リストボックス内のアイテムにほとんど問題はありません。逆シリアル化されたXMLからListbox.ItemsSourceとして追加しても、更新されません。INotifyPropertyChangedインターフェイスを実装しましたが、まだ何かが不足しています。
ListBox宣言は次のとおりです。
<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>
Realmlistsと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ファイルからリストボックスを埋めます。これは正常に機能しますが、問題は、それを使用して更新しようとすると何も起こりません。他のウィンドウで、その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に変更します。
どこを間違えたの?