所以我正在研究计算器,基本上是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
答案 0 :(得分:1)
history.SelectedItems
是collection,因此在其上调用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;的基础上提取部分文本。焦炭。编写转换器类非常容易。按照以下链接编写转换器: