首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScrollViewer忽略ContentTemplateSelector

ScrollViewer忽略ContentTemplateSelector
EN

Stack Overflow用户
提问于 2014-12-24 07:17:21
回答 2查看 280关注 0票数 5

我已经遇到了问题,使用ScrollViewer

下面是示例视图模型:

代码语言:javascript
复制
public class A
{
    public string Text { get; set; }
}

public class B
{
    public int Number { get; set; }
}

...and DataTemplateSelector

代码语言:javascript
复制
public class ViewModelTemplateSelector : DataTemplateSelector
{
    public DataTemplate ATemplate { get; set; }
    public DataTemplate BTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is A)
            return ATemplate;

        if (item is B)
            return BTemplate;

        return base.SelectTemplate(item, container);
    }
}

XAML:

代码语言:javascript
复制
<Grid>
    <Grid.Resources>
        <local:ViewModelTemplateSelector x:Key="ViewModelTemplateSelectorKey">
            <local:ViewModelTemplateSelector.ATemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Text}"/>
                </DataTemplate>
            </local:ViewModelTemplateSelector.ATemplate>
            <local:ViewModelTemplateSelector.BTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Number}"/>
                </DataTemplate>
            </local:ViewModelTemplateSelector.BTemplate>
        </local:ViewModelTemplateSelector>
    </Grid.Resources>

    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <ListBox x:Name="ListBox" ItemsSource="{Binding}"/>
    <ScrollViewer   Grid.Row="1" Content="{Binding SelectedItem, ElementName=ListBox}"  
                    ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}"/>
    <ContentControl Grid.Row="2" Content="{Binding SelectedItem, ElementName=ListBox}"                       
                    ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}"/>
</Grid>

这就是在ListBox中选择任何项目时所发生的事情

如您所见,ScrollViewer忽略ContentTemplateSelector,而ContentControl没有。ScrollViewer是从ContentControl继承而来的,乍一看,没有理由这样做。

我知道,如果我声明AB的隐式数据模板,ScrollViewer将正确处理它们,但对于我的实际应用程序来说,这不是一个选项。

这是已知的臭虫吗?还是我漏掉了什么?

UPD.

我已经提交了一份关于连接小姐的问题

EN

回答 2

Stack Overflow用户

发布于 2014-12-24 17:20:37

我没有测试语法。如果是错的,请告诉我,我会删除。

这就是我要尝试的

代码语言:javascript
复制
<ScrollViewer Grid.Row="1">
    <ContentControl Content="{Binding SelectedItem, ElementName=ListBox}"                       
                    ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}"/>
</ScrollViewer>
票数 1
EN

Stack Overflow用户

发布于 2014-12-24 17:59:32

这应该能起作用:

代码语言:javascript
复制
    <ScrollViewer Grid.Row="1">
        <ContentPresenter Content="{Binding SelectedItem, ElementName=ListBox}"  ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}" />
    </ScrollViewer>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27633050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档