2010-06-03 2 views
1

Я загружаю некоторые страницы 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> 

ОТВЕТ: Это был вопрос Pathing, спасибо за вашу помощь. Я могу связать как XmlDataProvider, так и другие источники данных объекта в XAML, загруженные во время выполнения. Огромная экономия времени. Создайте пользовательский интерфейс в Blend и в темноте свяжите их.

+1

Есть ли сообщения об ошибках в окне вывода? Установлен ли набор данных Canvas DataContext? – JustABill

+0

Не повторяйте теги в заголовке («C# WPF») –

+0

сообщений об ошибках, ничего не отображается в TextBlock. Я дам оба предложения и попробую сегодня и отправлю, если они помогут мне найти проблему. – discorax

ответ

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); 
} 
+0

+1 для XmlReader Спасибо, что указали это. – discorax

1

Действительно, вы можете сделать привязку с динамическим XAML. Я сделал это в прошлом, и он отлично работает.

Я не уверен, почему ваш пример не работает ... возможно, он не может найти ваш источник XML-провайдера?

Я, как правило, сделать что-то вроде:

twitter.DataContext = theContextYouWantToBindTo; 

, когда я построить контроль ... но я не уверен, что это имеет значение много. Кажется, что то, что вы пишете, должно работать.

Когда я хочу, чтобы убедиться, что контекст данных установлен правильно, я что-то вроде этого:

<TextBox Text="{Binding}"/> 

Это действительно просто шаг отладки, но это подтверждает, что я объект установлен в моих данных контекст.

Смежные вопросы