使用WPF动态加载内容

好的,我有一个容器,我已经创建了两个数据模板。 基本上,一个模板将显示5个文本框,并且对象数据绑定到它们,另一个模板将显示添加该特定对象的按钮。 我将DataTemplateSelector子类化并且它可以工作,但是当我浏览我的记录时,Selector永远不会被再次调用。

那么我将如何让容器重新选择它的模板。 容器是StackPanel,我已经尝试过UpdateVisuals,InvalidateVisuals,InvalidateArrange和ApplyTemplate。

XAML代码

                

在Group Box上更改内容的初始化

 grpAdv.ContentTemplateSelector = _advisorSelector; 

最后是选择器代码

 private readonly StudentWin _win; public AdvisorDataTemplateSelector(StudentWin win) { _win = win; } public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) { var sp = item as StackPanel; var adv = sp.DataContext as Advisor; if (adv == null) return _win.FindResource("addAdvisor") as DataTemplate; return _win.FindResource("advisorTemplate") as DataTemplate; } 

这是我的导航代码片段

 case "btnNext": { if(_view.CurrentPosition < _view.Count - 1) { CheckForUnusedReferences(_view.GetItemAt(_view.CurrentPosition) as Student); _view.MoveCurrentToNext(); CheckForNullReferences(_view.CurrentPosition); grpAdv.ApplyTemplate(); } } 

另外两个方法是检查学生之间的关系是否为空,他们将创建它并将其添加到数据上下文中,否则entity framework将不会保存更改。 上面的数据模板基本上可以帮助我解决在我尝试创建新学生时没有studentId的问题。

我使用以下方法强制重新应用DataTemplateSelector。

从ObservableCollection派生并添加一个使用NotifyCollectionChangedAction.Reset引发NotifyCollectionChangedEventArgs的方法。

 public class MyThingCollection : ObservableCollection { public void RaiseResetCollection() { OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } } 

您的视图模型公开此类型的实例,您的ItemsControl绑定到该类型。

 public class MyViewModel : ... (view model base) { public MyThingCollection Items{get; private set;} }  

当您需要重新应用DataTemplateSelector时,请在集合上调用RaiseResetCollection。

我通常像这样使用DataTemplateSelector

 public class MyTemplateSelector : DataTemplateSelector { public DataTemplate Template1 { get; set; } public DataTemplate Template2 { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { ... return Template1 or Template2 depending on item } ... }  ...   ...