在加载的DataTemplateSelector上绑定不同的Target

时间:2013-04-23 09:26:32

标签: c# wpf data-binding triggers

我正在使用DataTemplateSelector选择不同的UserControls(引用http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector),根据所选路径选择所需的UserControl。

现在的问题是,当使用WebBrowser控件时,我应该将它绑定到MyScrollViewer的ActualHight,但是在其他所有它上面它与Hight一起工作,否则滚动条显示不好。必须来自WebBrowser控件。

如何根据加载的UserControl在Hight / ActualHight之间切换ContentControl中的Bindings?

<DataTemplate x:Key="WebTemplate1">
    <DockPanel LastChildFill="True">
        <controls:WebBrowserUserControl SourceHtml="{Binding Converter={StaticResource UriConverter1}}" />
    </DockPanel>
</DataTemplate>

<DataTemplate x:Key="ImgTemplate1">
    <Image Source="{Binding Converter={StaticResource RelativeToAbsolutePathConverter1}}"
           Stretch="None" />
</DataTemplate>

...

<ScrollViewer Name="MyScrollViewer"
              HorizontalAlignment="Stretch"
              VerticalAlignment="Stretch"
              DockPanel.Dock="Left"
              HorizontalScrollBarVisibility="Auto"
              VerticalScrollBarVisibility="Auto">
    <Grid x:Name="MyGridHelper">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
            <DockPanel x:Name="MyDockPanel" Dock="Top" HorizontalAlignment="Left">
                <ContentControl x:Name="MyContentControl"
                                Width="{Binding ElementName=MyScrollViewer,
                                                Path=Width/ActualWidth}"
                                Height="{Binding ElementName=MyScrollViewer,
                                                 Path=Height/ActualHight}"
                                Content="{Binding Path=CurrentItem1,
                                                  Mode=OneWay}"
                                ContentTemplateSelector="{StaticResource MyTemplateSelector}" />
            </DockPanel>
    </Grid>
</ScrollViewer>

1 个答案:

答案 0 :(得分:1)

DataTemplateSelector本身不会影响ContentControl的其他属性,但是,您可以使用Converter根据用于确定哪个属性的相同逻辑来确定宽度\高度要使用的模板。所以像这样:

<ContentControl x:Name="MyContentControl"
                Width="{Binding ElementName=MyScrollViewer, Converter={StaticResource MyWidthConverter}, ConverterParameter="???"}"
                Height="{Binding ElementName=MyScrollViewer, Converter={StaticResource MyHeightConverter}, ConverterParameter="???"}"
                Content="{Binding Path=CurrentItem1, Mode=OneWay}"
                ContentTemplateSelector="{StaticResource MyTemplateSelector}" />

我为ConverterParameter添加了问号,因为我不清楚你如何确定哪种情况会调用哪个宽度/高度。但是你可以传入一个参数来决定传回哪个值,并根据该决定,Converter可以确定是获得ActualWidth / ActualHeight还是{{1的宽度/高度传入的内容。