2009-10-27 2 views
2

은 내가 WPF 그리드XmlDataProvider 새로 고침 소스 WPF

<Window x:Class="LabsRSS.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Poperecinii Timur Lab" Height="404" Width="588"> 
<Grid x:Name="blah"> 
    <Grid.Resources> 
     <XmlDataProvider x:Key="flickrdata" Source="http://api.flickr.com/services/feeds/photos_public.gne?tags=dog&amp;lang=en-us&amp;format=rss_200"> 
      <XmlDataProvider.XmlNamespaceManager> 
       <XmlNamespaceMappingCollection> 
        <XmlNamespaceMapping Prefix="media" Uri="http://search.yahoo.com/mrss/"/> 
       </XmlNamespaceMappingCollection> 
      </XmlDataProvider.XmlNamespaceManager> 
     </XmlDataProvider> 
     <DataTemplate x:Key="itemTemplate"> 
      <Image Width="75" Height="75" Source="{Binding Mode=OneWay, XPath=media:thumbnail/@url}"/> 
     </DataTemplate> 
     <ControlTemplate x:Key="controlTemplate" TargetType="{x:Type ItemsControl}"> 
      <WrapPanel IsItemsHost="True" Orientation="Horizontal"/> 
     </ControlTemplate> 
    </Grid.Resources> 
    <ItemsControl 
    Width="375" 
    ItemsSource="{Binding Mode=Default, Source={StaticResource flickrdata}, XPath=/rss/channel/item}" 
    ItemTemplate="{StaticResource itemTemplate}" 
    Template="{StaticResource controlTemplate}"> 
    </ItemsControl> 
    <TextBox Height="23" Margin="193,0,213,24" Name="textBox1" VerticalAlignment="Bottom" TextChanged="textBox1_TextChanged" /> 
</Grid> 

내가 뭘하려고하는 텍스트 상자에서 내 자신의 입력으로 태그를 대체하는 것입니다 수 있습니다.

private void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     XmlDataProvider dataProvider = (XmlDataProvider)this.blah.FindResource("flickrdata"); 
     XmlNamespaceManager xnManager = dataProvider.XmlNamespaceManager; 
     string newSource = "http://api.flickr.com/services/feeds/photos_public.gne?tags=flower&amp;lang=en-us&amp;format=rss_200"; 
     newSource = Regex.Replace(newSource, "(^.*tags=)(.+?)(&amp;.*$)", String.Format("{0}{1}{2}", "$1", textBox1.Text, "$3")); 
     dataProvider.Source = new Uri(newSource); 
     dataProvider.XmlNamespaceManager = xnManager; 
     dataProvider.Refresh(); 

    } 

이제는 URI가 좋게 설정되어있는 것처럼 보이지만 dataProvider가 콘텐츠를 새로 고치지 않습니다. 어떻게해야합니까?

답변

0

실제로 Refresh ... 또는 - 그 문제에 대해 XmlNamespaceManger를 설정하고 싶지 않습니다. 나는 Refresh에 대한 호출이 이미 XmlDataProvider에게 이미 가지고있는 것과 같은 소스를 다시로드하라고 말하고 있다고 생각한다.

소스를 변경하면로드 논리를 트리거하는 데 필요한 모든 것이되어야합니다. XmlNamespaceManager를 다시 설정하려면 DeferRefresh를 호출해야합니다. 그렇지 않으면 공급자가 모든 속성 변경시 다시로드하기 때문에 DeferRefresh를 호출해야합니다.

+1

"로드 논리를 트리거하는 데 필요한 원본이어야하는 소스를 변경하면 ..." 하지만 그렇지 않습니다. – Monomachus

관련 문제