[英]Usercontrol as DataTemplate no DataContext (null)
我遇到的問題是我的 DataTemplate (UserControl) 沒有 DataContext。 但我需要 DataContext,因為我有一個 Drop-Event,我在其中調用 ViewModel。
我得到了一個帶有ItemTemplateSelector="{StaticResource PropertyDataTemplateSelector}">的 ItemsControl,我在兩個不同的 UserControl 之間加載。
當我在 UserControl 的構造函數中設置斷點時,我看不到 DataContext。
我的 MainView 資源
<Window.Resources>
<Converter:DecreaseIntConverter x:Key="DecreaseIntConv" />
<Converter:PortalSlotConverter x:Key="PortalSlotConverter" />
<DataTemplate x:Key="SXUserControl"
DataType="{x:Type ViewModel:MainViewModel}">
<Resources:SXUserControl />
</DataTemplate>
<DataTemplate x:Key="XSUserControl"
DataType="{x:Type ViewModel:MainViewModel}">
<Resources:XSUserControl/>
</DataTemplate>
<Helper:PropertyDataTemplateSelector x:Key="PropertyDataTemplateSelector"
SXUserControl="{StaticResource SXUserControl}"
XSUserControl="{StaticResource XSUserControl}" />
</Window.Resources>
我的 MainView 中的 ItemsControl
<ItemsControl DockPanel.Dock="Right"
Width="Auto"
ItemsSource="{Binding MachineList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemTemplateSelector="{StaticResource PropertyDataTemplateSelector}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid ShowGridLines="True"
Helper:GridHelpers.RowCount="10"
Helper:GridHelpers.ColumnCount="4"
Helper:GridHelpers.StarColumns="0,1,2,3">
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
我的 ItemTemplateSelector:
public class PropertyDataTemplateSelector : DataTemplateSelector
{
public DataTemplate SXUserControl { get; set; }
public DataTemplate XSUserControl { get; set; }
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is Machine)
{
Machine machineItem = item as Machine;
if (machineItem.MachineType == MachineType.SX)
return
SXUserControl;
else
return
XSUserControl;
//element.FindResource("XSUserControl") as DataTemplate;
}
return null;
}
}
現在它起作用了! 添加到 UserControl 的構造函數中
public SXUserControl()
{
InitializeComponent();
allowDropConverter = new AllowDropConverter();
this.Loaded += new RoutedEventHandler(UserControl_Loaded); //!!!
}
和事件
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Window parentWindow = Window.GetWindow(this);
mainViewModel = (MainViewModel)parentWindow.DataContext;
}
感謝 Clemens 讓我重新考慮使用事件!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.