2012-02-26 4 views
1

J'ai un problème avec l'utilisation d'une zone de liste dans mon projet parent pour afficher une propriété définie dans un contrôle utilisateur. Pour être plus précis, j'ai créé un contrôle utilisateur qui contient un webbrowsercontrol, et j'ai défini une propriété appelée Historique qui contient l'historique des URL visitées lors d'une session de navigation. J'ai également un projet parent, qui est lié à ce contrôle utilisateur, dans lequel j'essaye de lier la propriété History à une Listbox. Le but est que quelqu'un puisse voir les urls de l'historique dans une Listbox définie dans ce projet parent, où les URL de l'historique sont remplies en se liant à la propriété History du contrôle utilisateur.Comment lier une propriété usercontrol à Listbox

Ci-dessous mon code Hiérarchique ce que je suis en train de faire:

FullWebBrowser.xaml.cs de contrôle utilisateur

public partial class FullWebBrowser : UserControl 
{ 
    //ctr 
    public FullWebBrowser() 
    { 
     InitializeComponent(); 

     //for FullWebBrowser.xaml ContentGrid 
     ContentGrid.DataContext = this;    
    } 

    #region Fields 

    //The navigation urls of the browser. 
    private readonly Stack<Uri> _NavigatingUrls = new Stack<Uri>(); 

    //The history for the browser 
    private readonly ObservableCollection<string> _History = new ObservableCollection<string>(); 

    /// <summary> 
    /// Gets the History property for the browser. 
    /// </summary> 
    public ObservableCollection<string> History 
    { 
     get { return _History; } 

    } 

La pile est _NavigatingUrls pour la mise en œuvre du bouton avant et en arrière, ce qui fonctionne très bien et le ObservableCollection _History contient les urls de la session de Navigation web sont représentées comme suit

//If the navigated uri is not in thehistory, add it 
      if (!_History.Contains(e.Uri.ToString())) 
       _History.Add(e.Uri.ToString()); 

Ceux-ci semblent fonctionner correctement, comme je h ave mis en œuvre les boutons avant et arrière et ils fonctionnent bien. Le problème est que je ne peux pas lier correctement la propriété History définie dans FullWebBrowser.xaml.cs à mon projet parent qui contient une zone de liste. Ceci est illustré comme suit

HistoryPage.xaml

xmlns:my="clr-namespace:FullBrowserControl;assembly=FullBrowserControl"> 

<!--LayoutRoot is the root grid where all page content is placed--> 
<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <!--Pivot Control--> 
    <controls:Pivot Title="QUEST"> 
     <!--Pivot item one--> 
     <controls:PivotItem Header="today"> 
      <Grid/> 
     </controls:PivotItem> 

     <!--Pivot item two--> 
     <controls:PivotItem Header="week"> 
      <Grid/> 
     </controls:PivotItem> 

     <!--Pivot item three--> 
     <controls:PivotItem Header="all"> 
      <StackPanel> 
       <ScrollViewer> 

        <ListBox x:Name="ListBox" ItemsSource="{Binding}" 
        SelectionChanged="ListBox_SelectionChanged"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Text="{Binding Path=History}" Height="Auto"/> 
          <TextBlock Foreground="{StaticResource PhoneSubtleBrush}" 
             Text="{Binding Modified, Converter={StaticResource DateConverter}}" 
             Margin="24,0,0,12"/> 


         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

       </Scrollviewer> 
      </StackPanel> 

      <!--<Grid/>--> 
     </controls:PivotItem> 
    </controls:Pivot> 
</Grid> 

Remarque, le DateConverter est ok. Ici, j'essaie d'implémenter une Listbox qui montre l'URL avec un horodatage en dessous. Le code derrière cette page de projet parent est le suivant

Historypage.xaml.cs

public partial class HistoryPage : PhoneApplicationPage 
{ 
    //Temporary State 
    public static readonly Setting<int> CurrentHistoryIndex = new Setting<int>("CurrentHistoryIndex", -1); 

    private FullWebBrowser browser = new FullWebBrowser(); 

    public HistoryPage() 
    { 
     InitializeComponent(); 

     //create new instance of FullWebBrowser user control? 
     this.browser = new FullWebBrowser(); 
     this.DataContext = browser; 
     //browser.DataContext = this; 
     //this.DataContext = browser.History; 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 

     //Clear the selection so selecting the same item twice in a row will still raise the SelectedChanged event 
     CurrentHistoryIndex.Value = -1; 
     this.ListBox.SelectedIndex = -1; 
    } 

    void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (ListBox.SelectedIndex >= 0) 
     { 
      //navigate to the page containing the user control for the selected item 
      //how to navigate to Mainpage.xaml and load webbrowsercontrol with selected url?? 
      CurrentHistoryIndex.Value = ListBox.SelectedIndex; 
      this.NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 
     } 
    } 
} 

Voici donc ma mise en œuvre de base. Peu importe ce que j'essaie je ne peux pas obtenir la Listbox dans Historypage pour se lier à la propriété History dans le contrôle utilisateur FullWebBrowser contenu en dehors du projet, j'ai référencé le contrôle FullWebBrowser en utilisant l'option références dans l'explorateur de solution, dans une déclaration top of Historypage.xaml.cs, et par une instruction xmlns en haut de HistoryPage.xaml

Toute aide avec comment cela peut être accompli serait grandement appréciée! Je travaille sur ce sujet depuis quelques semaines et je ne trouve pas la solution nulle part, même en rôdant les messages des autres. Je dois mettre en œuvre cette solution dès que possible! merci pour votre aide à l'avance. S'il vous plaît inclure le code pour accomplir cela, il serait tellement utile de voir comment cela est mis en œuvre pour référence future!

+0

Vérifiez la fenêtre de sortie lorsque vous l'exécutez, voyez-vous des erreurs de liaison? –

Répondre

0

Le DataContext de votre ListBox est FullWebBrowser donc votre force exécutoire devrait être comme suit:

<ListBox x:Name="ListBox" ItemsSource="{Binding Path=History}"/> 

Pour résoudre ce genre de problème vous-même essayer le débogage, le point d'arrêt de votre code inspectez les DataContext propriétés des divers éléments votre interface utilisateur.

+0

Merci pour les réponses! Paul, je ne vois aucune erreur de connexion de données, et Colin, j'ai mis ma liaison comme vous l'avez suggéré, mais la liste n'est toujours pas peuplée avec les URL de l'historique. Quel serait le format correct pour définir DataContext de Listbox à FullWebBrowser. Pour l'historique.xaml.cs, j'ai créé une nouvelle instance de FullWebBrowser comme suit car toutes mes recherches ont indiqué que cela est nécessaire pour mettre à jour la Listbox à mesure que les nouvelles pages sont parcourues dans le UserControl 'navigateur FullWebBrowser privé = new FullWebBrowser();' Quel est le code de liaison de données correct? – Matthew

+0

Je sais qu'il est courant de lier un ObservableCollection à une Listbox, c'est un standard, mais lorsque je lie un contrôle utilisateur en dehors du projet parent à une Listbox dans le projet parent, y a-t-il quelque chose qui me manque? J'ai référencé le contrôle utilisateur externe, donc je n'ai pas détecté d'erreurs lorsque j'essaie de lier le datacontext, mais il ne remplit simplement pas les urls de la propriété History du contrôle utilisateur vers la Listbox du projet parent. – Matthew

Questions connexes