将ListViewItem的字符串复制到TextBox中

时间:2016-01-07 13:33:04

标签: c# wpf listview calculator listviewitem

所以我正在研究计算器,基本上是Windows版本的副本,作为训练练习。我已经实施了过去计算的历史记录,并且我被要求将此历史记录从class FooActor(out:ActorRef)extends Actor { override def receive: Receive = active(Nil) def active(words:List[String]): Receive = Receive { case word_to_add: String => context.become(active(word_to_add :: words)) case ... } private def foo()=??? } 转换为TextBox。 我想要做的是当我点击它时将过去的一个计算复制回Listview Calculator,就像在Windows计算器中一样。

我的ListViewCode:

TextBox

这是<ListView Grid.Column="0" Grid.Row="1" Foreground="#616161" Name="history" Background="Transparent" HorizontalAlignment="Stretch" BorderThickness="0" Margin="10,10,10,0"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <EventSetter Event="MouseLeftButtonDown" Handler="RetrievePastCalculation" /> </Style> </ListView.ItemContainerStyle> </ListView> 方法,但它不起作用,当我点击RetrievePastCalculation时没有任何反应。顺便说一句,我是WPF的新手。

ListViewItem

这是我向private void RetrievePastCalculation(object sender, MouseButtonEventArgs e) { innerTextBox.Text = history.SelectedItems.ToString(); } 添加项目的地方我想,它是等于按钮的方法:

ListView

3 个答案:

答案 0 :(得分:1)

history.SelectedItemscollection,因此在其上调用ToString不会为您提供除类型名称之外的任何内容。如果你在调试器中尝试它(你应该),你会看到它返回System.Windows.Controls.SelectedItemCollection。现在,此时您可以通过以下两种方式解决问题:您可以继续使用当前基于事件的方法,也可以使用绑定。

<强>事件

对于事件,您可以将处理程序挂钩到您添加到列表中的每个Selected的{​​{1}}事件:

ListItem

然后定义处理程序本身:

private void ButtonEquals_Click(object sender, RoutedEventArgs e)
{
    Calculator calculate = new Calculator();
    textBox.Text = calculate.Calculate(innerTextBox.Text);

    var item = new ListViewItem();
    item.Content = innerTextBox.Text + "=" + textBox.Text;
    item.Selected += HistoryItem_Selected //hooks the handler to the 'Selected' event
    history.Items.Add(item);

    innerTextBox.Clear();
}

<强>装订

就代码量而言,绑定更简单,但学习曲线更陡峭。这里,我们将指定一个绑定表达式,而不是直接设置private void HistoryItem_Selected(object sender, RoutedEventArgs e) { // here 'sender' will be the ListItem which you clicked on // but since it's an object we need to cast it first ListViewItem listItem = (ListViewItem)sender; // now all that's left is getting the text and assigning it to the textbox innerTextBox.Text = listItem.Content.ToString(); } 属性。这意味着该值将始终与绑定表达式的值相同。

TextBox.Text

我在新的WPF项目中运行它并按预期工作:文本框显示列表中单击项目中的任何文本。

需要注意的是,两个解决方案都假设您要为<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <StackPanel> <ListView Grid.Column="0" Grid.Row="0" Name="history" /> <TextBox Text="{Binding ElementName=history, Path=SelectedItem.Content}" /> <Button Name="ButtonEquals" Content="equals" Click="ButtonEquals_Click"/> </StackPanel> </Grid> </Window> 分配字符串。如您所知,您可以将其他控件或任何对象分配给UI ListViewItem Content的{​​{1}}属性(Content继承自Control)。这就是为什么ListViewItem方法采用Control类型的参数并且不限于类型ListViewItem.Add之一的原因。如果您在按钮单击事件处理程序中分配了除字符串以外的任何内容,则上述两种情况都可能会中断。

答案 1 :(得分:1)

您可以将TextBox的值绑定到ListView的SelectedItem。这是一个例子:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<StackPanel>
  <ListView Grid.Column="0" Grid.Row="0" Foreground="#616161" Name="history" Background="Transparent" 
             HorizontalAlignment="Stretch" BorderThickness="0" Margin="10,10,10,0">
                <ListViewItem>Calc1</ListViewItem>
                <ListViewItem>Calc2</ListViewItem>
            </ListView>
            <TextBox Text="{Binding ElementName=history, Path=SelectedItem.Content}" />
</StackPanel>
</Page>

答案 2 :(得分:1)

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="100"/>
        <RowDefinition Height="100"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <ListView Grid.Column="0" Grid.Row="0" Foreground="#616161" Name="history" BorderThickness="1,1" Height="50" Width="200" SelectionChanged="history_SelectionChanged">
        <ListViewItem>
            <TextBlock> A ListView</TextBlock>
        </ListViewItem>
        <ListViewItem>
            with several
        </ListViewItem>
        <ListViewItem>
            items
        </ListViewItem>
    </ListView>

    <TextBox Grid.Row="1" Text="{Binding ElementName=history,Path=SelectedValue.Content}"
            BorderThickness="1,1" Height="50" Width="200"   />
</Grid>

如果使用XAML代码执行此操作会更好。尝试选择项目0和1以查看差异并了解listboxworks的方式。

现在用以下内容替换文本框绑定的文本:

Text="{Binding ElementName=history,Path=SelectedValue.Content.Text}"

并看到项目0的输出。希望您能够以更少的努力获得所需的输出。

现在您已经解释了整个问题,我认为您需要在TextBox的文本绑定中实现转换器。如下面的文字

Text="{Binding ElementName=history,Path=SelectedValue.Content.Text,Converter={StaticResource mytextconverter}}"

并记下一个逻辑,以便在&#39; =&#39;的基础上提取部分文本。焦炭。编写转换器类非常容易。按照以下链接编写转换器:

WPF Converter example