以编程方式从Windows Phone 8.1 XAML中的ListView中的特定ListViewItem到达TextBlock

Bas*_*maa 6 c# xaml windows-phone-8 windows-phone-8.1

我是Windows Phone 8.1的新开发人员,我尝试从ListView集合中获取特定的ListView项目,并能够为其内部的TextBock着色或着色,但我无法访问该项目或达到任何项目在ListView内部,请查看我的以下代码:

    protected async override void OnNavigatedTo(NavigationEventArgs e)
    {
                   SQLiteRT db1 = new SQLiteRT();
            var db_connection = await db1.Connection("MyDB.sqlite");

            List<MyTBL> t_list = db1.GetTable("SELECT * FROM MyTBL LIMIT 4 ORDER BY RANDOM() ;");
            db_connection.Close();

          LV_Options.ItemsSource = t_list;
    }
 // my List View called LV_Options
private void LV_Options_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
     ListView lv1 = sender as ListView;
     if (lv1 == null)
          return;

     MyTBL wrd = lv1.SelectedItem as MyTBL;
     if (wrd == null)
         return;

     TextBlock tb = lv1.FindName("TB_AMean1") as TextBlock;
     tb.FontSize = 17; // here I got debug error (it not worked !!!!!!!)

     var item =  LV_Options.Items.ElementAt(3); // this seems not work also !!!!
     item.BackColor = Color.LightSteelBlue; 

}
Run Code Online (Sandbox Code Playgroud)

正如您在上面所看到的,我尝试通过LV_Options.Items.ElementAt(3)来访问特定项目,但它不起作用!我还试图从选定的列表视图项目到达TextBlock,但也没有工作!

(更新)XAML代码:

<!-- Title Panel -->
        <StackPanel Grid.Row="0" Margin="19,0,0,0">
            <TextBlock Name="TB_Rslt" Text="Here result of your answer" Style="{ThemeResource TitleTextBlockStyle}" Margin="0,12,0,0"/>
            <TextBlock Text="page title" Margin="0,-6.5,0,26.5" Style="{ThemeResource HeaderTextBlockStyle}" CharacterSpacing="{ThemeResource PivotHeaderItemCharacterSpacing}"/>
        </StackPanel>

        <!--TODO: Content should be placed within the following grid-->
        <Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,10,19,15">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <TextBlock Name="TB_Question" Text="Choose Answer " Margin="0,0,25,0" HorizontalAlignment="Right" FontWeight="Bold" FontSize="22" FontFamily="Verdana" RenderTransformOrigin="0.5,0.5" />
            <TextBlock Name="TB_EnWord" Text="" Margin="90,0,15,0" HorizontalAlignment="Left" FontWeight="Bold" FontSize="22" FontFamily="Verdana" RenderTransformOrigin="0.5,0.5" TextAlignment="Right" />
            <StackPanel Grid.Row="1" Margin="5,22,0,0">
                <ListView Name="LV_Options" SelectionChanged="LV_Options_SelectionChanged">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid Margin="6">
                       <StackPanel VerticalAlignment="Top" Margin="10,0,0,0">
                 <TextBlock Name="TB_AMean1" Text="{Binding AMean1}" TextWrapping="Wrap"/>
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>

                </ListView>
            </StackPanel>
            <Button Name="Btn_Answer" Content="Ansewr" HorizontalAlignment="Left" Grid.Row="1" VerticalAlignment="Bottom" Click="Btn_Answer_Click"/>
Run Code Online (Sandbox Code Playgroud)

我的应用程序是一个测验应用程序,提供4个选项/选项作为每个问题的答案,当用户选择真正的答案时,我想突出显示真正的答案(真正的选择),使其背景为绿色,如果用户选择了错误回答/选项我想用红色表示该答案的背景(一个特定的列表视图项).

有什么帮助吗?

McG*_*gle 3

您将无法访问这样的数据模板内的元素。相反,利用与视图模型的绑定来设置颜色和其他与视图相关的属性。首先,为您的数据类创建一个包装视图模型:

public class MyTBLViewModel : INotifyPropertyChanged
{
    public MyTBL Entity
    {
        get { return _entity; }
    }
    private readonly MyTBL _entity;

    public Brush Highlight
    {
        get { return _brush; }
        set
        {
            _brush = value;
            RaisePropertyChanged("Highlight");
        }
    }
    private Brush _highlight;

    public double ItemFontSize
    {
        get { return _itemFontSize; }
        set
        {
            _itemFontSize = value;
            RaisePropertyChanged("ItemFontSize");
        }
    }
    private Brush _itemFontSize;

    public MyTBLViewModel(MyTBL entity)
    {
        _entity = entity;
        _highlight = new SolidColorBrush(Colors.Transparent);
        _itemFontSize = 12;
    }

    public event PropertyChangedEventArgs PropertyChanged;

    protected void RaisePropertyChanged(string propName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propName));
    }
}
Run Code Online (Sandbox Code Playgroud)

使用它作为您的ItemsSource

List<MyTBLViewModel> t_list = db1.GetTable("SELECT * FROM MyTBL LIMIT 4 ORDER BY RANDOM() ;")
    .AsEnumerable().Select(entity => new MyTBLViewModel(entity)).ToList();
Run Code Online (Sandbox Code Playgroud)

现在,在您的视图中,将视图元素绑定到“Highlight”和“ItemFontSize”,以及您喜欢的任何其他属性:

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid Margin="6" Background="{Binding Highlight}">
            <StackPanel VerticalAlignment="Top" Margin="10,0,0,0">
                <TextBlock Name="TB_AMean1" Text="{Binding Entity.AMean1}" TextWrapping="Wrap" 
                           FontSize="{Binding ItemFontSize}"/>
            </StackPanel>
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

SelectionChangedEventArgs最后,您可以从-- 使用它来更新与视图相关的属性中获取数据项:

private void LV_Options_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (var item in e.AddedItems.OfType<MyTBLViewModel>())
    {
        item.Highlight = new SolidColorBrush(Color.LightSteelBlue);
        item.ItemFontSize = 17;
    }

    foreach (var item in e.RemovedItems.OfType<MyTBLViewModel>())
    {
        item.Highlight = new SolidColorBrush(Colors.Transparent);
        item.ItemFontSize = 12;
    }
}
Run Code Online (Sandbox Code Playgroud)