none
wpf listbox采用ItemTemplateSelector后datatemplate内的控件事件无法通知到外部 RRS feed

  • 问题

  • <DataTemplate x:Key="DataTemplate1">
                <Grid><TextBlock MouseDown="TextBlock_MouseDown"/></Grid>
    </DataTemplate>

    <ListBox ItemTemplate="{StaticResource DataTemplate1}"

    采用这个方法。我在TextBlock_MouseDown()内调用委托可以通知到外部,而使用下面的方法,只修改该处,其他不变

    <ListBox ItemTemplateSelector="{StaticResource TypeTemplateSelector}"/>

    使用该方法,我在TextBlock_MouseDown()内调用委托没法通知到外部,原因是委托事件是null。

    有知道原因的告诉下


    2013年12月4日 7:04

答案

  • 你好,

    因为不知道你的DataTemplateSelector后台实现,在我的例子中,是没有问题的:

    public class ImgStringTemplateSelector : DataTemplateSelector
    {
            public DataTemplate ImageTemplate { get; set; }
            public DataTemplate StringTemplate { get; set; }
    
            public override DataTemplate SelectTemplate(object item,
              DependencyObject container)
            {
                String path = (string)item;
                String ext = System.IO.Path.GetExtension(path);
                if (System.IO.File.Exists(path) && ext == ".jpg")
                    return ImageTemplate;
                return StringTemplate;
            }
    }
    <Window.Resources>
            <local:RelativeToAbsolutePathConverter  x:Key="relToAbsPathConverter" />
    
            <DataTemplate x:Key="stringTemplate">
                <TextBlock Text="{Binding}" MouseDown="TextBlock_MouseDown" />
            </DataTemplate>
    
            <DataTemplate x:Key="imageTemplate">
                <Image Source="{Binding 
              Converter={StaticResource relToAbsPathConverter}}" 
            Stretch="UniformToFill" Width="200"/>
            </DataTemplate>
    
            <local:ImgStringTemplateSelector 
                ImageTemplate="{StaticResource imageTemplate}" 
                StringTemplate="{StaticResource stringTemplate}" 
                x:Key="imgStringTemplateSelector" />
    </Window.Resources>
    
    <Grid>
            <ListBox ScrollViewer.CanContentScroll="False"  ItemsSource="{Binding ElementName=This,  Path=PathCollection}" 
                      ItemTemplateSelector="{StaticResource imgStringTemplateSelector}">
            </ListBox>
    </Grid>

    根据ListBoxItem是否为jpg结尾,是的话找到相应图片,显示出来(imageTemplate),如果不是,仅仅显示String,使用的是stringTemplate:


    对于模板中的MouseDown事件,我这边是正常的


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月5日 12:28
    版主