C# WPF ListBox 鼠标点击迟到

C# WPF ListBox mouse click is late

我试图在左键单击 TextBlock 项目时使用 ListBox 项目中的文本更新该文本。

我的 C# 代码:

private void listBox_MouseDown_rem(object sender, MouseButtonEventArgs e)
{
    if (pathListB.SelectedItem != null)
    {
        rem_block.Text = pathListB.SelectedValue.ToString();
    }
}

XAML:

 <ListBox Name="pathListB" PreviewMouseLeftButtonDown="listBox_MouseDown_rem" HorizontalAlignment="Left" Height="246" Margin="10,10,0,0" VerticalAlignment="Top" Width="491"/>
 <TextBlock Name="rem_block" HorizontalAlignment="Left" Margin="10,261,0,0" TextWrapping="Wrap" Text="Select Item to Remove" VerticalAlignment="Top" Height="20" Width="411"/>

现在所有这些都按照预期的方式进行,除了当我 select a ListBoxItem(我在其他地方有一个循环填充这个 ListBox)它只更新到我以前的我下次点击鼠标时的值,所以它总是 "late."

所以例如我的列表框有这些项目:

Sentence 1
Sentence 2
Sentence 3

我会点击"Sentence 1",我的TextBlock不会改变。我点击 "Sentence 3",然后 TextBlock 更新为 "Sentence 1," 等。它总是更新到以前的值。

在 PreviewMouseDown 上,ListBox 项尚未更改。请改用 PreviewMouseUp 事件,该事件将在项目已更改时触发。

您可以创建一个名为 SelectedItem 的 属性(您绑定到的集合的类型)并将其绑定到列表框的 SelectedItem 属性。然后将 TextBlock 的 Text 属性 绑定到您定义的 SelectedItem 属性。

创建 SelectedItem 属性:

public string SelectedItem
    {
        get { return selectedItem; }
        set { selectedItem = value; }
    }

并且在你的 xaml 中:

<ListBox ItemsSource="{Binding Sentences}" SelectedItem="{Binding SelectedItem}" Grid.Column="1" />
<TextBlock Text="{Binding Path=SelectedItem}" />

需要在textbox中指定ElementName 属性来指定列表框名称

To solve this you should change your binding to the following:
<TextBlock ... Text="{Binding ElementName=pathListB, Path=SelectedItem.Content}" ... />

将列表框中的更新源触发器设置为属性已更改