Можете ли вы привязать данные, когда ваш XAML загружается во время выполнения? - PullRequest
1 голос
/ 04 июня 2010

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

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

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

Похоже, у вас есть опечатка в вашем 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>

Кроме того, к вашему сведению, XmlTextReader не рекомендуется с .NET 2.0. Вместо этого вы должны использовать следующее:

using (XmlReader rdr = XmlReader.Create(@".\TwitterModule\TwitterModule.xaml"))
{
    Canvas twitter = XamlReader.Load(rdr) as Canvas; 
    contentRoot.Children.Add(twitter); 
}
1 голос
/ 04 июня 2010

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

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

Я склонен делать что-то вроде:

twitter.DataContext = theContextYouWantToBindTo;

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

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

<TextBox Text="{Binding}"/>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...