Как связать свойство usercontrol со списком - PullRequest
1 голос
/ 26 февраля 2012

У меня проблема с использованием Listbox в моем родительском проекте для отображения свойства, определенного в пользовательском элементе управления.Чтобы быть более конкретным, я создал пользовательский элемент управления, который содержит webbrowsercontrol, и я определил свойство с именем History, которое содержит историю URL-адресов, посещенных во время сеанса просмотра.У меня также есть родительский проект, связанный с этим пользовательским элементом управления, в котором я пытаюсь связать свойство History со списком.Смысл в том, чтобы кто-то мог видеть URL-адреса истории в Listbox, определенном в этом родительском проекте, где URL-адреса истории заполняются путем привязки к свойству History пользовательского элемента управления.

Ниже приведен мой код с изложением того, что яя пытаюсь сделать:

Пользовательский контроль FullWebBrowser.xaml.cs

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; }

    }

Стек _NavigatingUrls предназначен для реализации кнопки вперед и назад, которая работает нормально, а коллекция _History observablecollection содержитURL-адреса из сеанса просмотра веб-страниц, показанные ниже

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

Они, кажется, работают правильно, так как я реализовал кнопки вперед и назад, и они работают нормально.Проблема в том, что я не могу правильно связать свойство History, определенное в FullWebBrowser.xaml.cs, с моим родительским проектом, который содержит Listbox.Это показано следующим образом:

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>

Обратите внимание, что преобразователь даты в порядке.Здесь я пытаюсь реализовать Listbox, который показывает URL с отметкой времени под ним.Код этой родительской страницы проекта выглядит следующим образом:

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

Так что это моя основная реализация.Независимо от того, что я пытаюсь сделать, я не могу получить привязку Listbox на странице History к свойству History в пользовательском элементе управления FullWebBrowser, содержащемся вне проекта, я ссылался на элемент управления FullWebBrowser с помощью параметра ссылки в обозревателе решений в объявлении использования вtop of Historypage.xaml.cs и оператором xmlns вверху HistoryPage.xaml

Любая помощь в достижении этой цели будет принята с благодарностью!Я работаю над этим пару недель и нигде не могу найти решение, даже бродя по постам других.Я должен реализовать это решение как можно скорее!заранее спасибо за вашу помощь.Пожалуйста, включите код для этого, это очень помогло бы увидеть, как это реализовано для дальнейшего использования!

1 Ответ

0 голосов
/ 26 февраля 2012

DataContext вашего ListBox равно FullWebBrowser, поэтому ваша привязка должна быть следующей:

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

Чтобы самостоятельно решить эту проблему, попробуйте отладку, остановите ваш код, затем проверьтеDataContext свойства различных элементов в вашем пользовательском интерфейсе.

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