1

なぜ私のリストボックスが空なのか、誰かが私を助けてくれますか?

XmlDocument には、次の XML が含まれています。

<Config>
  <Tabs>
    <Tab Name="Test1" />
    <Tab Name="Test2" />
  </Tabs>
</Config>

私のXAMLファイルでは、次のことを試しました

<Window>
  <Grid>
     <ListBox DataContext="{Binding {StaticResource Data}, XPath=//Tabs}" ItemsSource="{Binding XPath=Tab/@Name}">
     </ListBox>
  </Grid>
<Window>

name 属性へのバインディングを設定していないことはわかっていますが、これが機能していた場合、各タブ ノードの XmlDocument.XmlNode.ToString() を表示するべきではありませんか?

私のC#コンストラクタコードビハインド:

InitializeComponent();
this.doc = new XmlDocument();
doc.LoadXml(config.document.OuterXml);
XmlDataProvider provider = (XmlDataProvider)Resources["Data"];
provider.Document = doc;
provider.Refresh();

config.document.OuterXml上記のxmlを含む有効なドキュメントであること。

コレクションを使用して手続き型コードでこれを機能させましたが、XMLに直接バインドする方法を見つけようとしています。

更新: ListBox が空です

バインディング エラーはなくなりましたが、リスト ボックスが空になり、XML ファイルを再確認し、MessageBox.Show(provider.Document.OuterXML) を実行したところ、XmlDocument に正しいノードがあることを確認できました。

前もって感謝します

4

1 に答える 1

4

XmlDataProviderDocumentプロパティを に設定すると、イベントが発生XmlDocumentするたびにバインディングが更新されます。XmlNode.NodeChangedは依存関係プロパティではないためDocument、バインドできないため、コードで設定する必要があります。これでうまくいくはずです:

XAML で:

<Window.Resources>
   <XmlDataProvider x:Key="Data"/>
</Window.Resources>

...

<ListBox 
    DataContext="{Binding {StaticResource Data}, XPath=Config/Tabs}"
    ItemsSource="{Binding XPath=Tab/@Name}"/>

ウィンドウのコンストラクターで:

InitializeComponent();
XmlDocument d = new XmlDocument();
d.Load("MyData.xml");
XmlDataProvider p = (XmlDataProvider)Resources["Data"];
p.Document = d;

これで、 に加えた変更がXmlDocumentに反映されますListBox

編集:

あなたが何を間違っているのかはわかりませんが、おそらく、あなたがしていることを以下と比較するとわかるでしょう。これは完全に機能する例です。

Window1.xaml:

<Window x:Class="Test.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1">
    <Window.Resources>
        <XmlDataProvider x:Key="Data"/>
    </Window.Resources>
    <ListBox 
        DataContext="{Binding Source={StaticResource Data}, XPath=Config}" 
        ItemsSource="{Binding XPath=Tabs/Tab/@Name}"/>     
</Window>

Window1.xaml.cs:

using System.Windows;
using System.Windows.Data;
using System.Xml;

namespace Test
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            XmlDocument d = new XmlDocument();
            string xml = @"<Config><Tabs><Tab Name='foo'/><Tab Name='bar'/></Tabs></Config>";
            d.LoadXml(xml);
            ((XmlDataProvider) Resources["Data"]).Document = d;
        }
    }
}
于 2010-02-26T19:16:07.163 に答える