none
实现xml和xaml数据双向绑定的问题 RRS feed

  • 问题

  • 我有一个xml文件 其中定义了

    <?xml version="1.0" encoding="utf-8" ?>
    
    <colors xmlns="">
    
    	<colora>233</colora>
    
    </colors>
    
    我在xaml中进行了数据绑定 如下
    <Slider  Maximum="255" Minimum="0" Value="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, XPath=/colors/colora}" x:Name="ColorSliderA"/>

    绑定是双向的并且也定义了在属性更改时更新数据源  但是 我移动slider时,数据源的值并不会变  请问要如何做才能让xml中的数据源值改变
    2009年9月25日 4:46

答案

  • 楼主你好,
    -->你得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
    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
    2009年9月27日 10:01
    版主
  • 楼主,

    请问您试了我上面的方法吗?如有疑问,请继续回复.

    谢谢.


    Jim Zhou -MSFT
    2009年9月28日 8:57
    版主
  • 楼主,

    请问您试了我上面的方法吗?如有疑问,请继续回复.

    谢谢.


    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>
    
    2009年9月28日 12:24
  • 楼主你好,
    -->你得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
    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

    恩 明白了 后来我也是觉得可能是内存中的双向  谢谢
    2009年9月29日 8:30
  • 楼主,
    谢谢你的回复,如有其他疑问,请继续发贴,谢谢.


    Jim Zhou -MSFT
    2009年9月30日 7:24
    版主