在longlistselector模板中显示/隐藏控件

时间:2016-05-09 00:18:23

标签: c# .net windows-phone-8 windows-phone-8.1

我有一个longlistselector,它在应用程序中显示一组已保存的运行。保存的运行可能具有英里或公里的距离(取决于使用应用程序的文化),并且通常我将这两者都存储在模型中(以避免将10英里运行转换为9.9999英里运行,这在转换所有时间)。

在我的longlistselector的itemtemplate中,我将简单地在xaml中的模板中放入公制和英制字段,并在页面加载文化检查后隐藏无用的字段。

但是,我只能输入他们的名字,无法使用这些文本块。 Intellisense没有看到它们。我假设因为这是一个模板。

是否可以从代码隐藏中获取longlistselector itemtemplate中的xaml定义的文本块?或者我应该在加载时在代码中构建itemtemplate并优先将正确的文本块放入? (不是那种方法的粉丝,但我想我可以。)

我最初使用的是单独的字段和转换器,可以根据文化转换距离和选择单位,但这些使得事情变得有些混乱。

长名单选择器在xaml中显示如下:

 <phone:LongListSelector x:Name="SavedRunsListSelector" Margin="0,0,-12,0" ItemsSource="{Binding SavedRuns}">
                        <phone:LongListSelector.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Margin="0,0,0,0">
                                    <TextBlock Text="{Binding RunName}" Margin="0,0,0,-6"
                                     TextWrapping="Wrap"
                                     Style="{StaticResource PhoneTextLargeStyle}" 
                                     Foreground="{StaticResource PhoneAccentBrush}"/>
                          <!--<toolkit:WrapPanel Margin="0,-6,12,0" HorizontalAlignment="Stretch">-->
                              <TextBlock Text="{Binding RunDate, Converter={StaticResource ConverterRunDate}}"
                                         TextWrapping="Wrap"  HorizontalAlignment="Left"
                                         Margin="0,0,0,0"
                                         Style="{StaticResource PhoneTextSubtleStyle}"
                                         Opacity="1"/>
                              <TextBlock Text="{Binding RunDistMiles, Converter={StaticResource ConverterDistanceMilesWholeString}}" 
                                     x:Name="textBlockSavedRunsListDistanceMiles"
                                     TextWrapping="Wrap" Margin="0,-6,12,0" 
                                     Style="{StaticResource PhoneTextSubtleStyle}"/>
                          <TextBlock Text="{Binding RunDistKm, Converter={StaticResource ConverterDistanceKmWholeString}}" 
                                     x:Name="textBlockSavedRunsListDistanceKm"
                                     TextWrapping="Wrap" Margin="0,-6,12,0" 
                                     Style="{StaticResource PhoneTextSubtleStyle}"/>
                          <TextBlock Text="{Binding RunTimeTotalSecs, Converter={StaticResource SecToTimeConverter}}"
                                     TextWrapping="Wrap" Margin="0,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                      </StackPanel>
                  </DataTemplate>
              </phone:LongListSelector.ItemTemplate>
  </phone:LongListSelector>

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现目标。

1)如果您确实想要按名称访问DataTemplate中的项目,那么您将需要VisualTreeHelper的帮助。

请参阅How to access a named control inside a XAML DataTemplate (using CSharp) by Jerry Nixon,或者您可以通过代码隐藏来访问DataTemplate项目。

2)您可以使用ItemTemplate选择器,每个显示设置一个。见这里:LongListSelector different item template

3)或者你可以基本上将文本框的Visibility数据绑定到ViewModel中的转换器类。例如,如果“Km模式”,那么英里TextBlock的Visibility将为Collapsed