簡體   English   中英

用戶控件作為 DataTemplate 沒有 DataContext (null)

[英]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.

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