在运行时加载XAML时,您可以绑定数据吗?

时间:2010-06-03 23:26:49

标签: c# wpf data-binding xaml

我正在加载一些我创建的XAML页面,这些页面中包含一些数据绑定。但是,当我在运行时加载这些XAML文件时,它们的数据绑定不再有效。我想知道这是某种范围或路径问题,还是你不能做到。

以下是我加载XAML的方法

using (XmlReader rdr = XmlReader.Create(@".\TwitterModule\TwitterModule.xaml"))
                {
                    Canvas twitter = XamlReader.Load(rdr) as Canvas;
                    contentRoot.Children.Add(twitter);
                }

这是我最后的XAML

    <!--XAML -->    
    <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:LocalTrendsDS="clr-namespace:LocalTrendsDS;assembly=LocalTrendsDS" />
       <Canvas.Resources>
        <XmlDataProvider x:Key="TweetCounter" Source="..\temp\TweetCounter.xml" />
        <LocalTrendsDS:LocalTrends x:Key="LocalTrendsDataSource" />
    </Canvas.Resources> 
        <Canvas x:Name="root" Height="479"  Width="877" 
                    DataContext="{Binding Source={StaticResource TweetCounter}}">
                    <TextBlock x:Name="Number" 
                            Canvas.Left="86.744" LineHeight="122.919" TextAlignment="Right" TextWrapping="Wrap" Width="425.372" 
                            Text="{Binding Mode=OneWay, XPath=/Count}" />
            </Canvas>
<Canvas x:Name="_3a" Height="383" Canvas.Left="1971" Canvas.Top="107" Width="362" 
        DataContext="{Binding Source={StaticResource LocalTrendsDataSource}}">
    <TextBlock x:Name="TrendList" FontSize="16.449"  Canvas.Left="-0.806" LineHeight="16.449" TextAlignment="Left" TextWrapping="Wrap" Canvas.Top="112.155" Height="127.829"><TextBlock.RenderTransform>
                        <MatrixTransform Matrix="2.334,0,0,2.334,0,0"/>
                    </TextBlock.RenderTransform>
                    <Run Foreground="#FF9900EB" FontFamily="Hiruko Alternate" Text="1. "/>
                    <TextBlock Foreground="#FFFFFFFF" FontFamily="Segoe Semibold" Text="{Binding CurrentLocalTrends[0].Value, Mode=Default}"/><LineBreak/>
                    <Run Foreground="#FFDB0072" FontFamily="Hiruko Alternate" Text="2. "/>
                    <TextBlock Foreground="#FFFFFFFF" FontFamily="Segoe Semibold" Text="{Binding CurrentLocalTrends[1].Value, Mode=Default}"/><LineBreak/>
                    <Run Foreground="#FFFF0F1B" FontFamily="Hiruko Alternate" Text="3. "/>
                    <TextBlock Foreground="#FFFFFFFF" FontFamily="Segoe Semibold" Text="{Binding CurrentLocalTrends[2].Value, Mode=Default}"/><LineBreak/>
                    <Run Foreground="#FFFF6E05" FontFamily="Hiruko Alternate" Text="4. "/>
                    <TextBlock Foreground="#FFFFFFFF" FontFamily="Segoe Semibold" Text="{Binding CurrentLocalTrends[3].Value, Mode=Default}"/><LineBreak/>
                    <Run Foreground="#FFFF9F01" FontFamily="Hiruko Alternate" Text="5. "/>
                    <TextBlock Foreground="#FFFFFFFF" FontFamily="Segoe Semibold" Text="{Binding CurrentLocalTrends[4].Value, Mode=Default}"/><LineBreak/>
                </TextBlock>
</Canvas>
    </Canvas>

答案:感谢您的帮助,这是个问题。我能够在运行时加载的XAML中绑定XmlDataProvider和其他对象数据源。节省大量时间。在Blend中构建UI并在黑暗中绑定它们。

2 个答案:

答案 0 :(得分:2)

看起来您的XAML中有拼写错误。你的意思是以下吗?

<!--XAML -->
<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
  <Canvas.Resources>
    <XmlDataProvider x:Key="TweetCounter" Source="\temp\TweetCounter.xml" />
  </Canvas.Resources>
  <Canvas x:Name="root" Height="479"  Width="877"
              DataContext="{Binding Source={StaticResource TweetCounter}}">
    <TextBlock x:Name="Number"
            Canvas.Left="86.744" LineHeight="122.919" TextAlignment="Right" TextWrapping="Wrap" Width="425.372"
            Text="{Binding Mode=OneWay, XPath=/Count}" />
  </Canvas>
</Canvas>

另外,FYI,XmlTextReader自.NET 2.0以来已被弃用。您应该使用以下代码:

using (XmlReader rdr = XmlReader.Create(@".\TwitterModule\TwitterModule.xaml"))
{
    Canvas twitter = XamlReader.Load(rdr) as Canvas; 
    contentRoot.Children.Add(twitter); 
}

答案 1 :(得分:1)

实际上,您可以使用动态XAML进行绑定。我过去做过,而且效果很好。

我不确定为什么你的例子不起作用......可能找不到你的XML提供者来源?

我倾向于做类似的事情:

twitter.DataContext = theContextYouWantToBindTo;

当我构建控件时...但我不确定它是否重要。看起来你写的东西肯定会起作用。

当我想确保正确设置数据上下文时,我会这样做:

<TextBox Text="{Binding}"/>

这实际上只是一个调试步骤,但它确认我在数据上下文中设置了一个对象。