2010-06-03 5 views
1

내가 만든 일부 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을로드하고 방법입니다 그것은 당신의 도움에 대한 감사합니다 경로 지정 문제였다. 런타임에로드 된 XAML에서 XmlDataProvider 및 다른 Object Data Sources를 바인딩 할 수 있습니다. 엄청난 시간 절약. 블렌드 및 어둠 속에서 UI를 만들어 바인딩하십시오.

+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 for XmlReader 그 점을 지적 해 주셔서 감사합니다. – discorax

1

실제로 동적 XAML로 바인딩 할 수 있습니다. 나는 과거에 그 일을 해왔다.

귀하의 예제가 작동하지 않는 이유를 모르겠습니다 ... 아마도 XML 공급자 소스를 찾을 수 없습니까?

내가 좋아하는 뭔가를하는 경향이 : 내가 컨트롤을 구성

twitter.DataContext = theContextYouWantToBindTo; 

을 ...하지만 난 그게 더 중요한 것은 없습니다 확신합니다. 확실히 당신이 쓰고있는 것이 작동해야하는 것처럼 보입니다.

<TextBox Text="{Binding}"/> 

이것은 정말 디버깅 단계이지만, 내가 객체 내 데이터를 설정했는지 확인 : 나는 확실히 데이터 컨텍스트가 제대로 설정되어 있는지 확인하려는 경우

, 나는 같은 것을 할 문맥.

관련 문제