1

こんにちは、DataTemplate から生成された UIElement を見つけようとしています

しかし、ContentPresenter のどこかにあるはずの UserControl を見つけることができません。ブレークポイントとスヌープを介してコントロールを調べましたが、UserControl が見つかりません。

誰かが私がそれを見つけることができる場所を教えてもらえますか?

ここで私のテストプロジェクト:

アプリ XAML

<Application.Resources>
    <DataTemplate x:Name="TESTTemplate" DataType="{x:Type vmv:VM}">
        <vmv:MyView/>
    </DataTemplate>
</Application.Resources>

意見

<UserControl ...>
    <DataGrid ItemsSource="{Binding MyItems}"/>
</UserControl>

VM

public class VM
{
    private ObservableCollection<MyRow> myItems;

    public ObservableCollection<MyRow> MyItems
    {
        get { return myItems; }
        set { myItems = value; }
    }

    public VM()
    {
        myItems = new ObservableCollection<MyRow>();
        myItems.Add(new MyRow { Text = "a", Number = 1 });
        myItems.Add(new MyRow { Text = "s", Number = 2 });
        myItems.Add(new MyRow { Text = "d", Number = 3 });
        myItems.Add(new MyRow { Text = "f", Number = 4 });
    }
}

public class MyRow
{
    public string Text { get; set; }

    public int Number { get; set; }
}

メインウィンドウ XAML

<Window x:Class="MyPrinterAPI.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
    <ContentPresenter Name="CPresenter">

    </ContentPresenter>
    </StackPanel>
</Window>

コードビハインド

/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var vm = new VM();
        DataContext =vm;
        CPresenter.Content = vm;
    }
}
4

3 に答える 3

1

XAMLContentPresenterで a を直接使用するべきではありません...それは目的ではありません。その代わりに、 (独自の内部を持つ) a を使用するのがより一般的です。MainWindowContentControlContentPresenter

<Window x:Class="MyPrinterAPI.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <ContentControl Name="ViewControl" Content="{Binding ViewModel}" 
            ContentTemplate="{StaticResource TESTTemplate}" />
    </StackPanel>
</Window>

...

また、次の名前を付ける必要がありますUserControl

<DataTemplate x:Name="TESTTemplate" DataType="{x:Type vmv:VM}">
    <vmv:MyView name="View" />
</DataTemplate>

この設定を使用すると、次のことできるようになります ( MSDNの「方法: DataTemplate で生成された要素を検索する」ページから引用)。

// Getting the ContentPresenter from the ViewControl
ContentPresenter myContentPresenter = 
    VisualTreeHelper.GetChild(ViewControl, 0) as ContentPresenter;    
if (myContentPresenter != null)
{
    // Finding View from the DataTemplate that is set on that ContentPresenter
    DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
    MyView myView = (MyView)myDataTemplate.FindName("View", myContentPresenter);

    // Do something to the myView control here
}
于 2014-01-29T14:55:45.670 に答える