2008-12-04 34 views
3

比方說,我有XML的簡單chunck: -XML綁定在Silverlight沒有標稱類

<root> 
    <item forename="Fred" surname="Flintstone" /> 
    <item forename="Barney" surname="Rubble" /> 
</root> 

有取此XML在Silverlight我想這個ILKE的XAML其綁定: -

<ListBox x:Name="ItemList" Style="{StaticResource Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal">   
       <TextBox Text="{Binding Forename}" /> 
       <TextBox Text="{Binding Surname}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

現在我可以使用LINQ足夠簡單綁定到XML和標稱類: -

public class Person { 
    public string Forename {get; set;} 
    public string Surname {get; set;} 
} 

沒有這個課程可以完成嗎?

換句話說,Silverlight代碼和輸入XML之間的耦合僅限於XAML,其他源代碼不可知項目元素上的一組屬性。

編輯:建議使用XSD,但最終它的數量是相同的。 XSD->生成的類。

編輯:匿名類無效,Silverlight無法綁定它們。

編輯:這需要兩種方式,用戶需要能夠編輯值,這些值最終在XML中。 (在上面的示例中將原始TextBlock更改爲TextBox)

回答

0

據我所知,Silverlight綁定缺少WPF中找到的XPath屬性,所以沒有很好的方法直接綁定到XML。當我遇到這個問題時,我對模式使用了xsd.exe來生成我的類,然後使用Xml序列化來填充它們。這並不理想,但至少我不是自己編寫和維護類和映射。

+0

感謝您的回覆。 XSD也是我收到的最接近的。我希望有更靈活的東西。 – AnthonyWJones 2008-12-04 16:17:12

3

你可以用一個IValueConverter來做到這一點。下面是一個簡單的一個:

public class XAttributeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var xml = value as XElement; 
     var name = parameter as string; 
     return xml.Attribute(name).Value; 
    } 
} 

然後在XAML中,你可以參考類型轉換器,並通過屬性名作爲參數:

<ListBox x:Name="ItemList"> 
    <ListBox.Resources> 
     <local:XAttributeConverter x:Name="xcvt" /> 
    </ListBox.Resources> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Converter={StaticResource xcvt}, ConverterParameter=forename}" /> 
       <TextBlock Text="{Binding Converter={StaticResource xcvt}, ConverterParameter=surname}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

這是當你綁定到一個加載的XML XElement:

XElement xml = XElement.Parse("<root><item forename='Fred' surname='Flintstone' /><item forename='Barney' surname='Rubble' /></root>"); 

ItemList.ItemsSource = xml.Descendants("item"); 

不是超優雅的綁定語法,但它確實有效,比映射到類更容易。

+1

這是我最接近的。我很感激你的努力,我對我的可疑提問表示歉意。我遇到的問題是採用這種方法。 (我原來的Q包含TextBlock,我的意思是TextBox)。我需要這是可編輯的。 – AnthonyWJones 2008-12-04 23:10:21

0

你可以做一些類似於科比用一個匿名類查詢的建議嗎?

即:

var data = from c in xml.Descendants("item") 
         select new { Forename = c.Attribute("forename").Value, 
            Surname = c.Attribute("surname").Value }; 
ItemList.ItemsSource = data 

我認爲這應該工作,但我不是什麼地方,我可以測試它。如果沒有,有人讓我知道爲什麼,因爲現在我感興趣。

+0

好吧,我發現我肯定有一些根本性的錯誤,或者這是明顯的答案。那麼,哪部分不起作用? – MojoFilter 2008-12-04 18:15:58

+0

linq查詢的結果不是對象列表,而是{System.Linq.Enumerable.WhereSelectEnumerableIterator f__AnonymousType0 >},我不認爲它是可綁定的。嘗試一些調整,看看我是否可以使它工作。 – Bryant 2008-12-04 19:21:55