我正在加载一些我创建的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并在黑暗中绑定它们。
答案 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}"/>
这实际上只是一个调试步骤,但它确认我在数据上下文中设置了一个对象。