PropertyChangedEventHandler 空

PropertyChangedEventHandler null

我有 2 个 ObservableCollection<T>,每个人都有自己的 Card

public class Card: INotifyPropertyChanged
{
    private string _CardTitle;
    public string CardTitle
    {
        get { return _CardTitle; }
        set 
        { 
            _CardTitle = value;
            OnPropertyChanged("CardTitle");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

现在,由于 PropertyChangedEventHandlerCardTitle 卡的更改会反映在 UI 上。

但是当我一张卡片从一个集合移动到另一个集合然后更改CardTitle时,我得到handler as null 因此,PropertyChangedEventHandler 没有被触发,我看不到 UI 的变化。

我已经够挠头了,但想不通为什么。如果有人有任何想法,请在我遇到麻烦之前帮助我。

"move" 是什么意思?您从第一个集合中删除,然后添加到第二个是吗?您的数据上下文是否实现了 INotifyPropertyChanged?

我尝试重现您的代码,但没有遇到任何问题。看,也许你会发现一些提示:

MainPage.xaml.cs

public MainPage()
{
    this.InitializeComponent();

    this.NavigationCacheMode = NavigationCacheMode.Required;
    this.DataContext = this;
}

private ObservableCollection<Card> _first;
public ObservableCollection<Card> First
{
    get { return _first; }
    set
    {
        _first = value;
        OnPropertyChanged("First");
    }
}

private ObservableCollection<Card> _second;
public ObservableCollection<Card> Second
{
    get { return _second; }
    set
    {
        _second = value;
        OnPropertyChanged("Second");
    }
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    //Init collections
}

private void ChangeItemName(object sender, RoutedEventArgs e)
{
    var card = (sender as Button).DataContext as Card;
    card.CardTitle = ":)";
}

private void ChangeCollection(object sender, RoutedEventArgs e)
{
    var card = (sender as Button).DataContext as Card;
    First.Remove(card);
    Second.Add(card);
    card.CardTitle = "xD";
}

MainPage.xaml

<StackPanel>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <ListView ItemsSource="{Binding First}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding CardTitle}" />
                        <Button Content="Change name" Click="ChangeItemName" />
                        <Button Content="Change collection" Click="ChangeCollection" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <ListView ItemsSource="{Binding Second}" Grid.Column="1">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding CardTitle}" />
                        <Button Content="Change name" Click="ChangeItemName" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</StackPanel>