在ContentControl中的两个控件之间切换 [英] Switching between two controls in ContentControl

查看:78
本文介绍了在ContentControl中的两个控件之间切换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,目前,我正在尝试构建一个具有ContentControl的应用程序,该控件可在派生的DataGrid和ListBox之间切换,以提供有关Data的两个不同视图:

Hello, currently I am trying to build an application which has a ContentControl which switches between a derived DataGrid and a ListBox to provide two different views on Data:

<ContentControl Content="{Binding ElevationsView}" x:Name="ElevationsContentControl">
            <ContentControl.Resources>
                <DataTemplate x:Key="ElevationsDetailedList">
                    <local:ExtendedDataGrid ItemsSource="{Binding}" ScrollViewer.ScrollChanged="ElevationsDetailedList_ScrollChanged" AutoGenerateColumns="True" />
                </DataTemplate>
                <DataTemplate x:Key="ElevationsTileView">
                    <ListBox ItemsSource="{Binding}" ScrollViewer.ScrollChanged="ListBox_ScrollChanged" />
                </DataTemplate>
            </ContentControl.Resources>
            <ContentControl.Style>
                <Style TargetType="{x:Type ContentControl}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ViewMode}" Value="{x:Static local:ViewMode.DetailedList}">
                            <Setter Property="ContentTemplate" Value="{StaticResource ElevationsDetailedList}" />
                        </DataTrigger>
                    </Style.Triggers>
                    <Setter Property="ContentTemplate" Value="{StaticResource ElevationsTileView}" />
                </Style>
            </ContentControl.Style>
        </ContentControl>

ExtendedDataGrid目前仅是DataGrid的派生类,没有任何其他功能.但是,如果我启动应用程序,并且初始ViewMode为"DetailedList",则会收到错误"Type of ExtendedDataGrid"的对象. 无法转换为类型"System.Windows.Controls.ListBox".

The ExtendedDataGrid is at the moment only a derived class from DataGrid without any additional functionality. But if I start the application and the initial ViewMode is "DetailedList", I get the error "An object of Type "ExtendedDataGrid" cannot be converted into the type "System.Windows.Controls.ListBox".

如果我从ExtendedDataGrid或ListView中删除ScrollChanged事件,或者当我将ExtendedDataGrid更改为DataGrid时,它将起作用.但是对于我来说,这都不是可接受的解决方案,因为我需要ExtendedDataGrid和ScrollChanged事件.

It works, if I delete the ScrollChanged Event from either the ExtendedDataGrid or the ListView, or when I change the ExtendedDataGrid to DataGrid. But both aren't acceptable solutions for me, as I need the ExtendedDataGrid and the ScrollChanged event.

有人知道原因吗,或者可以给我解决方法?

Does somebody knows the cause of this or can give me a workaround?

推荐答案

您可以为已加载事件挂接事件处理程序XAML标记中ItemsControls的事件,然后在实际加载了正确的控件后,以编程方式挂钩适当的ScrollViewer.ScrollChanged事件处理程序:

You could hook up event handlers for the Loaded event of the ItemsControls in the XAML markup and then hook up the appropriate ScrollViewer.ScrollChanged event handler programmatically once the right control has actually been loaded:

            <ContentControl.Resources>
                <DataTemplate x:Key="ElevationsDetailedList">
                    <local:ExtendedDataGrid ItemsSource="{Binding}" Loaded="ExtendedDataGrid_Loaded"  AutoGenerateColumns="True" />
                </DataTemplate>
                <DataTemplate x:Key="ElevationsTileView">
                    <ListBox ItemsSource="{Binding}" Loaded="ListBox_Loaded" />
                </DataTemplate>
            </ContentControl.Resources>

        private void ListBox_Loaded(object sender, RoutedEventArgs e)
        {
            ListBox listBox = sender as ListBox;
            listBox.AddHandler(ScrollViewer.ScrollChangedEvent, new RoutedEventHandler(ListBox_ScrollChanged));
        }

        private void ExtendedDataGrid_Loaded(object sender, RoutedEventArgs e)
        {
            ExtendedDataGrid grid = sender as ExtendedDataGrid;
            grid.AddHandler(ScrollViewer.ScrollChangedEvent, new RoutedEventHandler(ExtendedDataGrid_Loaded));
        }


这应该满足XAML解析器:)


希望有帮助.


This should satisfy the XAML parser :)


Hope that helps.

请记住,通过将有用的帖子标记为答案来关闭话题,然后在遇到新问题时开始新话题.请不要在同一线程中问几个问题.

Please remember to close your threads by marking helpful posts as answer and then start a new thread if you have a new question. Please don't ask several questions in the same thread.


这篇关于在ContentControl中的两个控件之间切换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆