【问题标题】:show/hide a control in a longlistselector template在 longlistselector 模板中显示/隐藏控件
【发布时间】:2016-05-09 00:18:22
【问题描述】:

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

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

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

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

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

长列表选择器在 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>

【问题讨论】:

  • 经过反思,最简单的方法可能是在 xaml 中构建 2 个模板,然后在检查文化信息后在代码中应用正确的模板。更多的 xaml(但主要是复制/粘贴)和更简单的后台代码。

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


【解决方案1】:

您可以通过多种方式实现目标。

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

请参阅 How to access a named control inside a XAML DataTemplate (using CSharp) by Jerry Nixon 或者您可以搜索以从代码隐藏中访问 DataTemplate 项。

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

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

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多