0

我是 WPF 绑定的新手。当 ItemSource 中的一项修改其自己的依赖属性时,列表视图是否会自动更新。我试图用 FreezableCollection 来做。

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

主窗口.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>

主窗口.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>
    {

    }
4

1 回答 1

1

好的,现在您的 ListView 正在显示您的模型的字符串表示形式,这就是为什么您必须重写“ToString()”方法...因为您无法理解它以显示 Name 属性。

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

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

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

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

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

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

:) 希望能帮助到你。

于 2016-05-15T20:24:03.863 回答