gpt4 book ai didi

wpf - 如何在 wpf 中使 listview 自行更新?

转载 作者:行者123 更新时间:2023-12-02 07:15:50 25 4
gpt4 key购买 nike

我意识到这是一个很长的问题,但我在这里除了发布我的代码之外别无他法,为了清楚起见,我尽量保持简短。当然,这样做违反了大量最佳实践,这个例子已经足够长了..

我制作了一个非常简单的 wpf 应用程序

  • 在屏幕左侧显示人员列表(格式:姓名和年龄介于 () 之间)
  • 在屏幕右侧显示所选人员的所有属性
  • 在右侧您可以编辑属性并在消息框中查看整个选择

在下面的示例中,我编辑了 Bar 的年龄。但是,在列表中,年龄没有更新。如果我询问基础集合,它似乎仍然已更新..我怎样才能让名单知道?

除了屏幕截图外,以下是代码和 XAML

注意:如果图片没有显示,请尝试在新标签页或窗口中打开它。


alt text


namespace ASAPBinding
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }

public override string ToString()
{
return String.Format("{0} ({1})",Name,Age);
}
}

}

namespace ASAPBinding
{
public class Dal
{
public ObservableCollection<Person> Persons { get; set; }

public Dal()
{
Persons = new ObservableCollection<Person>();
Persons.Add(new Person() {Name = "Bar", Age = 25});
Persons.Add(new Person() {Name = "Foo", Age = 50});
}

public void PrintOutCollection()
{
MessageBox.Show(
Persons[0].ToString() + "\n" + Persons[1].ToString()
);
}
}
}

<Window x:Class="ASAPBinding.EditPersons"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ASAPBinding"
x:Name="window1"
Title="EditPersons" Height="300" Width="300">
<Window.Resources>
<local:Dal x:Key="dal"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>

<ListBox Name="ListBox1"
ItemsSource="{Binding Source={StaticResource dal}, Path=Persons, Mode=TwoWay}"
Grid.Column="0"/>
<StackPanel
DataContext="{Binding ElementName=ListBox1, Path=SelectedItem, Mode=TwoWay}"
Grid.Column="1" Margin="0,0,0,108">

<TextBox Text="{Binding Path=Name}" />
<TextBox Text="{Binding Path=Age}" />
<Button Click="Button_Click">Show Collection</Button>
</StackPanel>
</Grid>
</Window>

public partial class EditPersons : Window
{
public EditPersons()
{
InitializeComponent();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
Dal dal = (Dal) window1.FindResource("dal");
dal.PrintOutCollection();
}
}

最佳答案

仅仅有一个 ObservableCollection 是不够的,如果你想更新特定属性的绑定(bind),你的 Person 类型必须实现 INotifyPropertyChanged .

编辑

我刚刚注意到,您的左侧 ListBox 没有更新,因为您没有为 Person 对象设置 DataTemplate。您现在拥有的是一个 ToString() 实现,一旦它向 UI 报告,它就不会更新。

你需要这样的东西:

<DataTemplate DataType="{x:Type local:Person}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="("/>
<TextBlock Text="{Binding Age}"/>
<TextBlock Text=")"/>
</StackPanel>
</DataTemplate>

关于wpf - 如何在 wpf 中使 listview 自行更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1131937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com