wpf 更新LisBox中的选定项

tquggr8v  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(183)

我想在双击并修改文本框中的selectedItem后更新列表框中的项目,但没有成功。
XAML语言

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ListBox x:Name="lstTextes" SelectedItem="{Binding SelectedText,Mode=TwoWay}" ItemsSource="{Binding ListTexts,UpdateSourceTrigger=PropertyChanged}" Grid.Column="0"  Margin="52,54,117,85"  MouseDoubleClick="lstTextes_DblClick"/>

        <Popup x:Name="popLigText" StaysOpen="False" Grid.ColumnSpan="1" Width="300" IsOpen="false">

            <ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="500" Background="#F9F9F9" FontSize="11" Foreground="#0E1D31">
                <StackPanel>
                    <TextBox x:Name="TB_LigneText" HorizontalAlignment="Center" Text="{Binding Path=SelectedItem, ElementName=lstTextes, Mode=TwoWay}" Width="300" Height="30"  KeyDown="UpdateSelectedItem"/>
                </StackPanel>
            </ScrollViewer>
        </Popup>
    </Grid>
</Window>

代码vb.net
第一次
错误在哪里?谢谢您的帮助。
这个文本框会显示所选项目的文本。2如果我修改它,列表(字符串)ListText会被修改,但是文本框不会更新。

0dxa2lsx

0dxa2lsx1#

感谢您的详细回答。我添加了一个带有String属性的类属性

Class LineText

    Implements INotifyPropertyChanged
    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

    Private Property _Line As String

    Public Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs)
        If Not PropertyChangedEvent Is Nothing Then
            RaiseEvent PropertyChanged(Me, e)
        End If
    End Sub

    Public Property Line As String
        Get
            Return _Line
        End Get
        Set(value As String)
            _Line = value
            OnPropertyChanged(New PropertyChangedEventArgs("Line"))
        End Set
    End Property
End Class

我修改了ListTexts属性

Public Property ListTexts As List(Of LineText)

并在界面中将标签替换为TextBox

<ListBox x:Name="lstTextes" ItemsSource="{Binding Path=ListTexts}" Margin="133,30,267,204" Width="400" Height="200" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBox x:Name="labline" Text="{Binding Line}" Width="200"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

不再需要弹出窗口来修改文本行。谢谢

kg7wmglp

kg7wmglp2#

字符串是一个对象,是ListTexts集合的一个元素。ListBox.SelectedItem属性包含一个对象。通过更改TextBox中的文本,可以将一个新字符串(即新对象)分配给该属性。SelectedItem属性的逻辑检查ItemsSource集合中是否存在可分配的对象。如果不存在,则不接受该对象,并将其重置为null。
根据您的解释,您需要实现以下两个选项之一:

**1)**使用从TextBox接收的字符串,首先替换ListTexts集合中的字符串。然后才将此行添加到SelectedItem。为此,ListTexts必须是可观察的集合。
**2)**或者为ListTexts元素创建一个实体。此实体将具有一个字符串属性。在实体中实现INotifyPropertyChanged接口。然后可以将TextBox绑定到实体的属性。

<TextBox x:Name="TB_LigneText" HorizontalAlignment="Center"
         Text="{Binding Path=SelectedItem.SomeProperty, ElementName=lstTextes, Mode=TwoWay}"
         Width="300" Height="30"  KeyDown="UpdateSelectedItem"/>

相关问题