ListView项的自动更新

时间:2016-05-15 19:07:47

标签: c# wpf listview binding freezable

我是WPF Binding的新手。当ItemSource中的某个项修改其自己的dependecny属性时,listview是否有任何方式自动更新。我正在尝试使用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 个答案:

答案 0 :(得分:1)

确定, 现在你的ListView显示模型的字符串表示,这就是为什么你必须覆盖&#34; ToString()&#34;方法...因为你无法理解它以显示Name属性。

现在发生的事情是你的TextBox改变了Name属性,但是你的列表框并不知道&#34; Name&#34;属性已经改变...因为它正在查看ToString()

如果您设置&#34; DisplayMemberPath&#34;你的ListView到&#34;名称&#34; ,它不会看ToString(),而是&#34; Name&#34; ...就像这样:

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

请注意,在此模式下,如果使用文本框更改“名称”属性,文本框将无法更新&#34;名称&#34;的值。属性立即失去焦点,所以要解决这个问题,将文本框文本的绑定更改为:

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

我已添加&#34; UpdateSourceTrigger = PropertyChanged&#34;确保在开始更改TextBox的文本时,Name属性会立即更新。

:)希望它有所帮助。