Автоматическое обновление элементов ListView

Я новичок в WPF Binding. Есть ли способ, которым список автоматически обновляется, когда один из элементов в ItemSource изменяет свое собственное свойство dependecny. Я пытался сделать это с 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>
    {

    }

1 ответ

Решение

Хорошо, прямо сейчас ваш ListView показывает строковое представление ваших моделей, поэтому вам пришлось переопределить метод "ToString()"... потому что вы не смогли его понять, чтобы показать свойство Name.

Теперь происходит то, что ваш TextBox хорошо меняет свойство Name, но ваш список не знает, что свойство "Name" изменилось... потому что он смотрит на ToString ()

если вы установите "DisplayMemberPath" вашего ListView в "Name", он будет смотреть не на ToString(), а на "Name"... вот так:

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

Обратите внимание, что в этом режиме, если вы измените свойство Name с помощью текстового поля, текстовое поле не будет обновлять значение свойства "Name" мгновенно, пока оно не потеряет фокус, поэтому для исправления измените привязку текста текстового поля к следующему:

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

Я добавил "UpdateSourceTrigger=PropertyChanged", чтобы при изменении текста TextBox свойство Name обновлялось мгновенно.

:) Надеюсь, поможет.

Другие вопросы по тегам