我目前在將XML綁定到Silverlight應用程序中的GUI時遇到問題。尤其是使用雙向綁定。在Silverlight中使用綁定到XML
正如我們所知,在使用WPF的Windows客戶端應用程序中執行操作確實很容易。 這裏你可以這樣做:
XML:
<person>
<firstname>Test</firstname>
<surname>Test</surname>
<email>[email protected]</email>
</person>
和查看網格編輯(使用XLINQ或XPath綁定)一個XAML頁面:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="3*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="221*" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="First name:" />
<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Path=Element[firstname].Value, Mode=TwoWay}" />
<TextBlock Grid.Column="0" Grid.Row="1" Text="Surname:" />
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Path=Element[surname].Value, Mode=TwoWay}" />
<TextBlock Grid.Column="0" Grid.Row="2" Text="EMail:" />
<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Path=Element[email].Value, Mode=TwoWay}" />
</Grid>
由於中雙向模式用戶直接寫入XML。
但是,在Silverlight中沒有像上例那樣的綁定選項。但是微軟在Silverlight 4中添加了XPathEvaluate-Method()。
所以我試圖將完整的XDocument綁定到每個TextBox,並使用ConverterParameter傳遞一個XPath表達式並對其進行評估。
<Grid x:Name="LayoutRoot">
<TextBlock Text="{Binding Path=Data, Converter={StaticResource TestKonverter}, ConverterParameter=//firstname, Mode=TwoWay}" FontSize="20" />
</Grid>
和...
public class XMLConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var __doc = (XDocument)value;
var __xpath = (IEnumerable)__doc.XPathEvaluate(parameter.ToString());
return (__xpath.Cast<XElement>().FirstOrDefault());
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//getting the attached XDocument again as __doc ?!
var __xpath = (IEnumerable)__doc.XPathEvaluate(parameter.ToString());
(__xpath.Cast<XElement>().FirstOrDefault()).Value = value.ToString();
return value;
}
}
爲了得到某種形式的雙向結合,我想到了使用XPath的表達,以獲得正確的節點,並寫在它的新價值。 問題是,在ConvertBack-Method()我看不到如何獲取XDocument的方法。有什麼辦法通過ConvertBack中的給定參數來獲取XDocument,而不是將其設置爲靜態的地方?