【问题标题】:How to get the ListBox' tapped item to print it somewhere else?如何让 ListBox 的点击项目在其他地方打印?
【发布时间】:2016-06-13 20:27:30
【问题描述】:

我在ListBox 中显示文件的行。我需要抓住用户点击的行并将其显示为ButtonContent

我做了这样的事情:

void OnItemTapped(object sender, TappedRoutedEventArgs args)
{
    firstElement.Content = itemsControl.SelectedItem.ToString();
}

在 xaml 中我有:

<Button Name="firstElement"                
        Content="{Binding}"
        Grid.Row="1" Grid.Column="0"
        Tapped="OnItemTapped" />

这样OnItemTapped 将数据发送到我的按钮。

数据来自:

<ListBox x:Name="itemsControl"
         ItemsSource="{Binding}"
         FontSize="24"
         Width="1100"
         HorizontalAlignment="Center">

问题是 ListBox 中的数据不是正确显示的,而是 MyNamespace.ItemsData 这是类的地址,我在其中防止字符串拆分 ListBox 行(我在 5 TextBlocks 中显示每一行 - 每个一个词)。

public class ItemsData
{
    public string value0 { get; set; }
    public string value1 { get; set; }
    public string value2 { get; set; }
    public string value3 { get; set; }
    public string value4 { get; set; }
}

【问题讨论】:

    标签: c# xaml listbox uwp


    【解决方案1】:

    您需要先转换为您的模型,然后选择您需要显示的属性。像这样:

    firstElement.Content = (itemsControl.SelectedItem as ItemsData).value0;
    

    根据您的设计来获取您可以这样做的所有属性:

    var x = (itemsControl.SelectedItem as ItemsData);
    firstElement.Content = string.Format("{0},{1},{2},{3},{4}" , x.value0 , x.value1 , x.value2 , x.value3 , x.value4);
    

    在 C#6 中你可以:

    firstElement.Content = string.Format($"{x.value0},{x.value1},{x.value2},{x.value3},{x.value4}");
    

    【讨论】:

    • 这不是总能得到第一个项目的文本,不管点击哪个项目?
    • @AlexDrenea...OP 需要先转换为模型才能访问模型属性,否则返回 MyNamespace.ItemsData
    • 当然可以,但是您提供的代码总是会将内容设置为 value0,这显然不是他想要的。
    • @paddy...根据您当前的设计并获得所有属性,我认为应该是这样的唯一方法:var x = (itemsControl.SelectedItem as ItemsData); firstElement.Content = (x.value0 + x.value1 + x.value2 + x.value3 + x.value4);
    • 不,不要对字符串使用“+”。那很糟糕。在 C#6 中使用 string.Format、string.Concat 或新的内联字符串连接 $"{x.value0} {x.value1} {x.value2} {x.value3} {x.value4}"。
    【解决方案2】:

    您可以使用 ElementName 绑定:

    <Button Name="firstElement"                
            Content="{Binding ElementName=itemsControl, Path=SelectedItem}"
            Grid.Row="1" Grid.Column="0"/>
    

    但是因为 SelectedItem 是一个 ItemsClass 实例,你需要重写它的 ToString() 方法来获取你需要的文本:

    public class ItemsData
    {
        public string value0 { get; set; }
        public string value1 { get; set; }
        public string value2 { get; set; }
        public string value3 { get; set; }
        public string value4 { get; set; }
    
        public string AllValues 
        {
            get 
            {
                return $"{value0} {value1} {value2} {value3} {value4}";
            }
        }
    
        public override string ToString()
        {
            return AllValues;
        }
    }
    

    查看this 很棒的文档以获取详细的绑定属性列表。

    *注意:您的列表将处理所有选择显示和突出显示,因此至少为此,您不需要使用 Tapped 事件。

    【讨论】:

    • 我使用点击来让用户选择并突出显示选项。
    猜你喜欢
    • 2010-09-08
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多