WPF绑定ListBox主/详细信息

我可以使用XmlDataSource但不能使用我自己的类。 我想要做的就是将列表框绑定到我的集合实例,然后将文本框链接到列表框,以便我可以编辑该人的姓名(双向)。 我故意保持这个尽可能简单,希望有人可以填补空白。

XAML:

                  

C#代码背后:

 namespace WpfListTest { ///  /// Interaction logic for Window1.xaml ///  public partial class Window1 : Window { public People MyPeeps = new People(); public Window1() { InitializeComponent(); MyPeeps.Add(new Person("Fred")); MyPeeps.Add(new Person("Jack")); MyPeeps.Add(new Person("Jill")); } } public class Person { public string Name { get; set; } public Person(string newName) { Name = newName; } } public class People : List { } } 

Web上的所有示例似乎都有一个静态类返回代码定义的数据(比如返回new Person(“blah blah”))而不是我自己的集合实例 – 在本例中是MyPeeps。 或者也许我没有说出正确的搜索咒语。

有一天,我可能突然突破了解这个有约束力的东西,但此刻它让我感到困惑。 任何帮助赞赏。

正确的方法是使用MVVM模式并创建一个ViewModel,如下所示:

 public class MainWindowViewModel : INotifyPropertyChanged { private People _myPeeps; private Person _selectedPerson; public event PropertyChangedEventHandler PropertyChanged; public People MyPeeps { get { return _myPeeps; } set { if (_myPeeps == value) { return; } _myPeeps = value; RaisePropertyChanged("MyPeeps"); } } public Person SelectedPerson { get { return _selectedPerson; } set { if (_selectedPerson == value) { return; } _selectedPerson = value; RaisePropertyChanged("SelectedPerson"); } } private void RaisePropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } } 

像你这样在View的代码中初始化它:

 public partial class MainWindow : Window { private readonly MainWindowViewModel _viewModel; public MainWindow() { _viewModel = new MainWindowViewModel(); _viewModel.MyPeeps = new People(); _viewModel.MyPeeps.Add(new Person("Fred")); _viewModel.MyPeeps.Add(new Person("Jack")); _viewModel.MyPeeps.Add(new Person("Jill")); DataContext = _viewModel; InitializeComponent(); } } 

并绑定数据如下:

                   

绑定将像这样工作:

窗口本身的DataContext设置为ViewModel实例。 因为ListBox和TextBox没有指定任何DataContext ,所以它们从Windowinheritance它。 如果没有指定其他内容,则对象上的绑定始终相对于DataContext起作用。 这意味着TextBox绑定在其DataContext (即在MainWindowViewModel )查找属性SelectedPerson ,并在该SelectedPerson查找属性Name

此示例的基本机制如下:ViewModel上的SelectedPerson属性始终与ListBoxSelectedItem同步, TextBoxText属性始终与SelectedPersonName属性同步。

尝试从ObservableCollectioninheritance您的People