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 的文本时,名称 属性 会立即更新。
:) 希望对您有所帮助。
我是 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 的文本时,名称 属性 会立即更新。
:) 希望对您有所帮助。