![](/img/trans.png)
[英]WPF and Prism - Binding to TemplateSelector driven ListBoxItem's IsSelected event is not firing in ViewModel bound code
[英]WPF TemplateSelector in custom control - usage in code
在我的 MVVM 項目中,我必須創建一個從網格繼承的自定義控件RowGrid 。 此控件具有ItemsSource和ItemsTemplateSelector 。 (我沒有使用 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.