积极答复者
实现xml和xaml数据双向绑定的问题

问题
-
我有一个xml文件 其中定义了
<?xml version="1.0" encoding="utf-8" ?> <colors xmlns=""> <colora>233</colora> </colors>
<Slider Maximum="255" Minimum="0" Value="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, XPath=/colors/colora}" x:Name="ColorSliderA"/>
绑定是双向的并且也定义了在属性更改时更新数据源 但是 我移动slider时,数据源的值并不会变 请问要如何做才能让xml中的数据源值改变
答案
-
楼主你好,
-->你得data是在xml里的 我的需要他在一个xml文件中 上面是文件 按你上面的改成这样xml文件还是不会在silder改变的时候 文件自动更新喔!
对XML文件的binding我们要注意一点,就是在运行时,我们对XML数据的任何更改都是在内存中进行的,也就是说这个是临时的,这个更改结果是临时反映在内存中的,如果我们不手动保存到本地硬盘的话,程序一退出,所有的改动都不会自动保存(即使你设置了TwoWay binding).
在这个例子中,我们可以像下面这样保存结果(所有的改动都完成后):
XmlDataProvider xml = this.Resources["xmlData"] as XmlDataProvider;
xml.Document.Save("D:/temp.xml");
如果你原先的XML文件路径是D:/temp.xml,在保存的时候,你可以设成一样,这样新文件就会更换原来的文件了.
-->另外我还想问 如果我上面的文件color那行有多个 是否可以条件绑定到一条上
你可以使用multi value converter,对多个数据进行处理后,再返回一个合适的值。
这是一个关于IMultiValueConverter的MSDN的文档
http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx
如有疑问,请继续回复。
谢谢
Jim Zhou -MSFT- 已标记为答案 Jim Zhou - MSFTModerator 2009年9月29日 7:52
全部回复
-
楼主你好,
-->绑定是双向的并且也定义了在属性更改时更新数据源 但是 我移动slider时,数据源的值并不会变 请问要如何做才能让xml中的数据源值改变
你是怎么data binding的呢?根据上面你的代码看,XML中的数据会随着Slider的Value改变面变的,我下面是一个例子:
<Window.Resources>
<XmlDataProvider x:Key="xmlData" XPath="colors/colora">
<x:XData>
<colors xmlns="">
<colora ID="233">233</colora>
</colors>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<StackPanel DataContext="{Binding Source={StaticResource xmlData}}">
<Label Content="{Binding XPath=@ID}" />
<Slider Maximum="255"
Minimum="0"
Value="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
XPath=@ID}" x:Name="ColorSliderA"/>
</StackPanel>
谢谢.
Jim Zhou -MSFT -
楼主,
请问您试了我上面的方法吗?如有疑问,请继续回复.
谢谢.
Jim Zhou -MSFT<?xml version="1.0" encoding="utf-8" ?> <ChangeColor> <User value="1">1</User> <Color valueR="255" valueG="100" valueB="155" valueA="140">255</Color> </ChangeColor>
你得data是在xml里的 我的需要他在一个xml文件中 上面是文件 按你上面的改成这样xml文件还是不会在silder改变的时候 文件自动更新喔!
另外我还想问 如果我上面的文件color那行有多个 是否可以条件绑定到一条上
代码如下: 还请大家赐教
<Window x:Class="DataBindingColor.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DataBindingColor" Height="231" Width="309"> <Window.Resources> <XmlDataProvider x:Key="xmlData" Source="D:\work\WPF\DataBindingColor\DataBindingColor\Color.xml" XPath="ChangeColor/Color"> </XmlDataProvider> </Window.Resources> <Grid Height="194" DataContext="{Binding Source={StaticResource xmlData}}"> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="50" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="50" /> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Grid.Row="0" Margin="5" VerticalAlignment="Center">Red</TextBlock> <Slider Grid.Column="1" Grid.Row="0" Margin="5" VerticalAlignment="Center" Maximum="255" Minimum="0" Value="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, XPath=@valueR}" x:Name="ColorSliderR" /> <TextBox Grid.Column="2" Grid.Row="0" Margin="5" VerticalAlignment="Center" Text="{Binding Path=Value, ElementName=ColorSliderR}"/> <TextBlock Grid.Column="0" Grid.Row="1" Margin="5" VerticalAlignment="Center">Green</TextBlock> <Slider Grid.Column="1" Grid.Row="1" Margin="5" VerticalAlignment="Center" Maximum="255" Minimum="0" Value="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, XPath=@valueG}" x:Name="ColorSliderG" /> <TextBox Grid.Column="2" Grid.Row="1" Margin="5" VerticalAlignment="Center" Text="{Binding Path=Value, ElementName=ColorSliderG}"/> <TextBlock Grid.Column="0" Grid.Row="2" Margin="5" VerticalAlignment="Center">Blue</TextBlock> <Slider Grid.Column="1" Grid.Row="2" Margin="5" VerticalAlignment="Center" Maximum="255" Minimum="0" Value="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, XPath=@valueB}" x:Name="ColorSliderB"/> <TextBox Grid.Column="2" Grid.Row="2" Margin="5" VerticalAlignment="Center" Text="{Binding Path=Value, ElementName=ColorSliderB}"/> <TextBlock Grid.Column="0" Grid.Row="3" Margin="5" VerticalAlignment="Center">Alpha</TextBlock> <Slider Grid.Column="1" Grid.Row="3" Margin="5" VerticalAlignment="Center" Maximum="255" Minimum="0" Value="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, XPath=@valueA}" x:Name="ColorSliderA"/> <TextBox Grid.Column="2" Grid.Row="3" Margin="5" VerticalAlignment="Center" Text="{Binding Path=Value, ElementName=ColorSliderA}"/> <Button Name="MainButton" Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="4" HorizontalAlignment="Center" Width="100" Margin="5"> <Rectangle Width="10" Height="10" Fill="Red"/> </Button> </Grid> </Window>
-
楼主你好,
-->你得data是在xml里的 我的需要他在一个xml文件中 上面是文件 按你上面的改成这样xml文件还是不会在silder改变的时候 文件自动更新喔!
对XML文件的binding我们要注意一点,就是在运行时,我们对XML数据的任何更改都是在内存中进行的,也就是说这个是临时的,这个更改结果是临时反映在内存中的,如果我们不手动保存到本地硬盘的话,程序一退出,所有的改动都不会自动保存(即使你设置了TwoWay binding).
在这个例子中,我们可以像下面这样保存结果(所有的改动都完成后):
XmlDataProvider xml = this.Resources["xmlData"] as XmlDataProvider;
xml.Document.Save("D:/temp.xml");
如果你原先的XML文件路径是D:/temp.xml,在保存的时候,你可以设成一样,这样新文件就会更换原来的文件了.
-->另外我还想问 如果我上面的文件color那行有多个 是否可以条件绑定到一条上
你可以使用multi value converter,对多个数据进行处理后,再返回一个合适的值。
这是一个关于IMultiValueConverter的MSDN的文档
http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx
如有疑问,请继续回复。
谢谢
Jim Zhou -MSFT- 已标记为答案 Jim Zhou - MSFTModerator 2009年9月29日 7:52
-
楼主你好,
-->你得data是在xml里的 我的需要他在一个xml文件中 上面是文件 按你上面的改成这样xml文件还是不会在silder改变的时候 文件自动更新喔!
对XML文件的binding我们要注意一点,就是在运行时,我们对XML数据的任何更改都是在内存中进行的,也就是说这个是临时的,这个更改结果是临时反映在内存中的,如果我们不手动保存到本地硬盘的话,程序一退出,所有的改动都不会自动保存(即使你设置了TwoWay binding).
在这个例子中,我们可以像下面这样保存结果(所有的改动都完成后):
XmlDataProvider xml = this.Resources["xmlData"] as XmlDataProvider;
xml.Document.Save("D:/temp.xml");
如果你原先的XML文件路径是D:/temp.xml,在保存的时候,你可以设成一样,这样新文件就会更换原来的文件了.
-->另外我还想问 如果我上面的文件color那行有多个 是否可以条件绑定到一条上
你可以使用multi value converter,对多个数据进行处理后,再返回一个合适的值。
这是一个关于IMultiValueConverter的MSDN的文档
http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx
如有疑问,请继续回复。
谢谢
Jim Zhou -MSFT
恩 明白了 后来我也是觉得可能是内存中的双向 谢谢