ListView 项目的自动更新

Automatic updte of ListView items

我是 WPF 绑定的新手。当 ItemSource 中的一项修改其自身的依赖项 属性 时,列表视图是否有任何方式自动更新。我试图用它来处理 FreezableCollection。

下面给出了我的代码,目的是在修改文本框时更新列表框。

MainWindow.xaml

<Grid x:Name="mainDataGrid">
    <StackPanel Orientation="Horizontal">
        <ListView x:Name="membersListView" ItemsSource="{Binding}" MinWidth="100"/>
        <StackPanel>
            <TextBox x:Name="selectedItemTextBox" Text="{Binding ElementName=membersListView, Path=SelectedItem.Name, Mode=TwoWay}" MinWidth="200"/>
        </StackPanel>
    </StackPanel>
</Grid>

MainWindow.cs

public partial class MainWindow : Window
{
    ViewModel vm;
    public MainWindow()
    {
        InitializeComponent();
        vm = new ViewModel();
        vm.Add(new Model() { Name = "Name1" });
        vm.Add(new Model() { Name = "Name2" });
        this.DataContext = vm;
    }
}
public class Model : Freezable
    {
        public String Name
        {
            get { return (String)GetValue(NameProperty); }
            set { SetValue(NameProperty, value); }
        }
        public override string ToString()
        {
            return Name;
        }
        // Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty NameProperty =
            DependencyProperty.Register("Name", typeof(String), typeof(Model), new PropertyMetadata(""));

        protected override Freezable CreateInstanceCore()
        {
            return new Model();
        }
    }
    public class ViewModel : FreezableCollection<Model>
    {

    }

好的, 现在你的 ListView 正在显示你的模型的字符串表示,这就是为什么你必须覆盖 "ToString()" 方法......因为你无法理解显示名称 属性.

现在发生的事情是您的 TextBox 很好地更改了名称 属性 但您的列表框不知道 "Name" 属性 已经更改...因为它正在查看 ToString( )

如果您将 ListView 的 "DisplayMemberPath" 设置为 "Name" ,它不会查看 ToString(),而是 "Name" ...像这样:

<ListView x:Name="membersListView" ItemsSource="{Binding}" DisplayMemberPath="Name" MinWidth="100"/>

请注意,在此模式下,如果您使用文本框更改名称 属性,则 文本框不会立即更新 "Name" 属性 的值,直到它失去焦点,因此要修复此问题,请将文本框文本的绑定更改为:

<TextBox x:Name="selectedItemTextBox" Text="{Binding ElementName=membersListView, Path=SelectedItem.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="200"/>

我添加了 "UpdateSourceTrigger=PropertyChanged" 以确保当您开始更改 TextBox 的文本时,名称 属性 会立即更新。

:) 希望对您有所帮助。