C# 将TextBlock绑定到ListView更改的属性

C# 将TextBlock绑定到ListView更改的属性,c#,wpf,binding,properties,observer-pattern,C#,Wpf,Binding,Properties,Observer Pattern,我就是搞不懂。绑定文本块时我缺少了什么? 每次我在ListView中选择一个新项目时,我都需要TextBlock进行更新 这是我做的样品。在我的实际应用程序中,我使用ListView1中的id从我的DB中获取我想要在文本块中显示的内容 我知道WPF绑定到属性,我需要实现INotifyPropertyChanged,但是我不能正确地进行绑定,或者我缺少了其他东西 我添加了DateTime.Now.toString只是为了更清楚地看到文本块是否发生了更改 XAML: C OnPropertyChan

我就是搞不懂。绑定文本块时我缺少了什么? 每次我在ListView中选择一个新项目时,我都需要TextBlock进行更新

这是我做的样品。在我的实际应用程序中,我使用ListView1中的id从我的DB中获取我想要在文本块中显示的内容

我知道WPF绑定到属性,我需要实现INotifyPropertyChanged,但是我不能正确地进行绑定,或者我缺少了其他东西

我添加了DateTime.Now.toString只是为了更清楚地看到文本块是否发生了更改

XAML:

C


OnPropertyChanged需要具有正确的属性名称

而不是OnPropertyChangedPersonName;使用


+哇,谢谢,我不知道。哦,我知道它必须有名字作为财产。第一个测试看起来很有效。我会接受更多的测试后。
<Window x:Class="WpfSO.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0" x:Name="txtBlockPerson" 
                                Text="{Binding MyPerson}" />


        <ListView Grid.Row="1" Grid.Column="0" x:Name="ListView1" 
                  ItemsSource="{Binding ListData}" 
                  IsSynchronizedWithCurrentItem="True" 
                  SelectionChanged="ListView1_SelectionChanged">

            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Left" />
                </Style>
            </ListView.ItemContainerStyle>

            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Window>
using System;
using System.ComponentModel;
using System.Windows;
using System.Collections.ObjectModel;

namespace WpfSO
{
    public partial class MainWindow : Window
    {
        private ObservableCollection<Person> ListData { get; set; }
        private const string _myName = "You clicked on: ";
        public Person MyPerson { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            // TextBlock
            MyPerson = new Person(_myName);
            txtBlockPerson.DataContext = MyPerson;

            // ListView
            ListData = new ObservableCollection<Person>();
            var p1 = new Person("p1");
            var p2 = new Person("p2");
            ListData.Add(p1);
            ListData.Add(p2);

            ListView1.ItemsSource = ListData;
        }

        private void ListView1_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            MyPerson.Name = _myName + ListView1.SelectedItem + ". Time: " +DateTime.Now.ToString(); 
        }
    }

    public class Person : INotifyPropertyChanged
    {
        private string _name;
        public event PropertyChangedEventHandler PropertyChanged;

        public string Name
        {
            get { return _name; }
            set
            {
                if (value != _name)
                {
                    _name = value;
                    OnPropertyChanged("PersonName");
                }
            }
        }

        public Person(string name)
        {
            Name = name;
        }

        // Create the OnPropertyChanged method to raise the event 
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}
OnPropertyChanged("Name");