Элементы управления XAML не распознаются в программном коде

У меня есть странная проблема, когда элемент управления XAML не виден в коде позади. Вот пример XAML:

<ListView Name="lvtest" Grid.Row="2" Grid.ColumnSpan="2" Margin="0,20,0,0" 
              ItemsSource="{Binding Content}" >
    <ListView.ItemTemplate>
        <DataTemplate>     
            <StackPanel>                                
                <WebView Name="contentView" Style="{StaticResource BodyTextStyle}" />
                <TextBlock Name="testtxt" Text="{Binding}" Style="{StaticResource BodyTextStyle}" Foreground="GreenYellow"/>

В коде позади:

this.lvtest распознается, но:

this.contentView и this.testtxt - нет.

Я также пробовал x:Name.

Мне явно не хватает чего-то очевидного здесь, я просто не вижу что.

РЕДАКТИРОВАТЬ:

Чтобы уточнить, элемент управления текстовым полем должен был использоваться для отображения некоторого форматированного текста на основе привязки, но я обнаружил, что текст имеет формат HTML (это предлагает использовать элемент управления WebView). Насколько я вижу, мне нужно NavigateToString использовать элемент управления WebView, и поэтому я не могу привязать его как таковой.


person Paul Michaels    schedule 24.06.2012    source источник


Ответы (2)


Чего вам не хватает, так это того, что элементы, определенные в DataTemplate, могут быть на странице любое количество раз, что может даже измениться во время работы. Какой из них должен быть связан с полем contentView? Нет хорошего способа ответить на этот вопрос, поэтому он просто не создает поле contentView.

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

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

Изменить: что-то вроде этого может сработать для вас:

<WebView Loaded="contentView_Loaded" Style="{StaticResource BodyTextStyle}" />

Затем в коде:

void contentView_Loaded(object sender, EventArgs e)
{
    var contentView = (WebView)sender;
    var dataContext = (YourDataType)contentView.DataContext;
    // do something
}
person Tim S.    schedule 24.06.2012
comment
Я отредактировал вопрос. В основном я пытаюсь отобразить отформатированный HTML в связанном списке (для этого изначально был TextBlock). - person Paul Michaels; 24.06.2012
comment
Это не работает, но вы наставили меня на правильный путь - спасибо - person Paul Michaels; 24.06.2012

Они скрыты, потому что находятся внутри элемента управления шаблона.

С http://social.msdn.microsoft.com/Forums/en/wpf/thread/29ecc8ee-26ee-4331-8f97-35ff9d3e6886

<ListView  Name="listview">

    <ListView.ItemTemplate>

        <DataTemplate>

            <StackPanel Orientation="Horizontal" >

            <TextBlock Name="textYear" Text="{Binding Year}" />

                <TextBlock  Text="  " />

             <TextBlock Name="textDayOffWeek" Text="{Binding DayOfWeek}" />

                </StackPanel>

        </DataTemplate>

    </ListView.ItemTemplate>

    <s:DateTime >1/2/2007</s:DateTime>

    <s:DateTime >1/3/2008</s:DateTime>

    <s:DateTime >1/5/2007</s:DateTime>

    <s:DateTime >1/6/2006</s:DateTime>

</ListView>

    <Button Width="180" Height="30" Content="Find TextBlock in DataTemplate" Click="FindElement" />

    </StackPanel>

In the code behind:

  private void FindElement(object sender, RoutedEventArgs e)

    {

        // get the current selected item

        ListViewItem item = listview.ItemContainerGenerator.ContainerFromIndex(listview.SelectedIndex) as ListViewItem;

        TextBlock textYear = null;

        if (item != null)

        {

            //get the item's template parent

            ContentPresenter templateParent = GetFrameworkElementByName<ContentPresenter>(item);

            //get the DataTemplate that TextBlock in.

            DataTemplate dataTemplate = listview.ItemTemplate;

            if (dataTemplate != null && templateParent != null)

            {

                 textYear = dataTemplate.FindName("textYear", templateParent) as TextBlock;

            }

            if (textYear != null)

            {

                MessageBox.Show(String.Format("Current item's Year is:{0}", textYear.Text));

            }

        }



    }

    private static T GetFrameworkElementByName<T>(FrameworkElement referenceElement) where T : FrameworkElement

    {

        FrameworkElement child = null;

        for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceElement); i++)

        {

            child = VisualTreeHelper.GetChild(referenceElement, i) as FrameworkElement;

            System.Diagnostics.Debug.WriteLine(child);

            if (child != null && child.GetType() == typeof(T))

            { break; }

            else if (child != null)

            {

                child = GetFrameworkElementByName<T>(child);

                if (child != null && child.GetType() == typeof(T))

                {

                    break;

                }

            }

        }

        return child as T;

    }
person Chris Gessler    schedule 24.06.2012