3

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コントロールを使用する必要があるため、そのようにバインドすることはできません。

4

2 に答える 2

8

不足しているのは、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
}
于 2012-06-24T13:17:56.227 に答える
3

テンプレートコントロール内にあるため、非表示になっています。

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>

背後にあるコード:

  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;

    }
于 2012-06-24T13:17:48.660 に答える