我有一个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)如果您确实想按名称访问DataTemplate中的项目,则需要VisualTreeHelper的帮助。

请参见How to access a named control inside a XAML DataTemplate (using CSharp) by Jerry Nixon,或者您可以通过searc从后台代码访问DataTemplate项目。

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

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

07-28 02:55
查看更多