我是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>
{
}
答案 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属性会立即更新。
:)希望它有所帮助。