show/hide longlistselector 模板中的控件

show/hide a control in a longlistselector template

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

在我的 longlistselector 的项目模板中,我打算在 xaml 的模板中简单地放入公制和英制字段,并在对页面加载进行文化检查后隐藏无用的字段。

但是,我无法通过简单地键入它们的名称来访问这些文本块。智能感知看不到它们。我假设是因为这是一个模板。

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

我最初打算使用单独的字段和转换器来转换距离并根据文化选择单位,但这让事情变得有点混乱。

Longlist 选择器在 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) 如果您真的想通过名称访问 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 中的转换器 class。例如,如果 "Km mode",则 TextBlock 的 Visibility 英里将为 Collapsed