1

关于以下代码。

    public class ViewModel : INotifyPropertyChanged
    {
        public int Model { get; private set; }
        public ViewModel(int _model)
        {
            Model = _model;
        }

        PropertyChangedEventHandler m_propertyChangedEventHandler;
        public event PropertyChangedEventHandler PropertyChanged
        {
            add
            {
                m_propertyChangedEventHandler += value;
                Console.WriteLine("Add");
            }
            remove
            {
                m_propertyChangedEventHandler -= value;
                Console.WriteLine("Remove");
            }
        }
    }

    public partial class Window1 : Window
    {
        public ObservableCollection<ViewModel> ViewModels { get; private set; }

        public Window1()
        {
            ViewModels = new ObservableCollection<ViewModel>() { new ViewModel(1), new ViewModel(2), new ViewModel(3) };
            DataContext = this;
            InitializeComponent();
        }

        protected override void OnPreviewMouseDoubleClick(MouseButtonEventArgs e)
        {
            base.OnPreviewMouseDoubleClick(e);
            Content = new Button();
        }
    }


<Window x:Class="WpfApplication97.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <ListBox ItemsSource="{Binding ViewModels}"
             DisplayMemberPath="Model"/>
</Window>

双击时,windows 内容将被替换,这应该清除现有的控件绑定(注销 PropertyChanged,并输入删除访问器)。

在 .net 4.0 下运行,它按预期工作,但在 3.5 下运行(在这种情况下,直到您关闭窗口才会调用 Remove)

为什么会这样,我可以在 3.5 中获得相同的行为吗?

4

0 回答 0