簡體   English   中英

自定義控件中的 WPF TemplateSelector - 代碼中的用法

[英]WPF TemplateSelector in custom control - usage in code

在我的 MVVM 項目中,我必須創建一個從網格繼承的自定義控件RowGrid 此控件具有ItemsSourceItemsTemplateSelector (我沒有使用 ItemsControl,因為我需要為每個孩子設置一個相對大小,並且我通過將列寬設置為 x* 來做到這一點)我試圖在代碼中使用ItemsTemplateSelector分配模板,但是它不能正常工作:

Children.Clear();
int i = 0;
foreach (var element in ItemsSource)
{
    if (element != null)
    {
        DataTemplate dataTemplate = ItemTemplateSelector.SelectTemplate(element, null);
        ContentControl contentControl = new ContentControl
        {
            DataContext = element, 
            ContentTemplate = dataTemplate
        };
        Children.Add(contentControl);
        SetColumn(contentControl, i);
    }
    i++;
}

ItemTemplateSelector.SelectTemplate 是一個簡單的開關/案例,根據元素的類型,返回特定的 DataTemplate。

DataTemplate 示例如下:

<DataTemplate x:Key="StringTemplate">
    <Grid>
       <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Label Content="{Binding Name}" Grid.Column="0"></Label>
        <customControls:MyStringTextBox MyString="{Binding}" Grid.Column="1"/>
    </Grid>
</DataTemplate>

如果我使用 ItemsControl 而不是我的RowGrid自定義控件,則 DataTemplate 的綁定起作用。

如果我使用我的自定義控件,他們不會。

這意味着 ItemsSource 很好,ItemsTemplateSelector 很好,DataTemplate 很好。 問題是我如何將 DataTemplate 及其 ViewModel 放在一起

我究竟做錯了什么? 我錯過了什么?

感謝您的支持!

我不太喜歡它,但我找到了解決方案:

我以這種方式初始化 contentControl:

ContentControl contentControl = MergeTemplateWithContext(dataTemplate, element)

public static ContentControl MergeTemplateWithContext(DataTemplate template, object context)
{
    ContentControl contentControl = new ContentControl
    {
        ContentTemplate = template
    };
    contentControl.Loaded += (object sender, RoutedEventArgs e) =>
    {
        if (VisualTreeHelper.GetChildrenCount(contentControl) > 0)
        {
            DependencyObject child = VisualTreeHelper.GetChild(contentControl, 0);
            if (child is ContentPresenter contentPresenter && VisualTreeHelper.GetChildrenCount(contentPresenter) > 0)
            {
                 DependencyObject grandChild = VisualTreeHelper.GetChild(contentPresenter, 0);
                 if (grandChild is FrameworkElement frameworkElement)
                 {
                     frameworkElement.DataContext = context;
                 }
            }
        }
    } ;
    return contentControl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM