ScrollViewer忽略ContentTemplateSelector。

5
我遇到了一个问题,使用ScrollViewer
以下是示例视图模型:
public class A
{
    public string Text { get; set; }
}

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

...以及 DataTemplateSelector:

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:

<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 中选择任何项时,发生的情况如下:

enter image description here

正如您所看到的,ScrollViewer忽略了ContentTemplateSelector,而ContentControl则没有。 ScrollViewer继承自ContentControl,乍一看,这种行为似乎没有理由。
我知道,如果我为AB声明隐式数据模板,ScrollViewer将正确处理它们,但这对于我的实际应用程序不是选项。
这是已知的错误吗?还是我漏掉了什么? 更新。 我在MS Connect上提交了一个问题

你是否曾经到达 SelectTemplate 方法? - eran otzap
@eranotzap:不,对于ScrollViewer它永远不会被触发。 - Dennis
1
ScrollViewer使用ScrollContentPresenter来呈现其内容,我猜它不像在ContentControl下直接呈现时那样应用给定的ContentTemplate。 - eran otzap
2个回答

1

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

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

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dennis

1
这应该能行:

    <ScrollViewer Grid.Row="1">
        <ContentPresenter Content="{Binding SelectedItem, ElementName=ListBox}"  ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}" />
    </ScrollViewer>

(加一)我喜欢这个答案,我需要检查这个假设,但我相信ScrollViewer会知道忽略它自己的ContentPresenter(即ScrollContentPresenter),并像你所做的那样声明使用你提供的那个。 - eran otzap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接