INotifyPropertyChanged в UserControl возвращает бесконечный цикл

Я пытаюсь сделать Facebook-клиент, и у меня есть файл XAML:

<UserControl x:Class="UISkripsi3.Sidebar"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:UISkripsi3="clr-namespace:UISkripsi3"
    xmlns:local="clr-namespace:UISkripsi3">
<UserControl.Template>

        <ControlTemplate TargetType="{x:Type UISkripsi3:Sidebar}">
            <DataTemplate x:Key="StatusAndOther" DataType="{x:Type local:NewsFeedResources}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <StackPanel Orientation="Vertical">
                            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="10">
                                <Image x:Name="ProfilePicture" Source="{Binding Path=ProfilePict}" Stretch="Fill" Width="80" Height="80" VerticalAlignment="Top"></Image>
                                <StackPanel Orientation="Vertical" Margin="5">
                                    <TextBlock Text="{Binding Path=UserName}" Style="{StaticResource UserNameStyle}"  VerticalAlignment="Top"/>
                                    <TextBlock Text="{Binding Path=Message}" Foreground="White" TextWrapping="Wrap" Width="400" VerticalAlignment="Top" HorizontalAlignment="Left"/>                                      
                                    <StackPanel Orientation="Horizontal">
                                        <Image x:Name="Icon" Source="{Binding Path=icon}" Width="10" Height="10"></Image>
                                        <TextBlock Text=" via " Foreground="White"></TextBlock>
                                        <TextBlock Text="{Binding Path=attribution}" Foreground="White"></TextBlock>
                                        <StackPanel Orientation="Vertical">
                                        <Button x:Name="LikeButton" VerticalAlignment="Top" Content="like" IsEnabled="{Binding canLike}" ToolTip="Like" Click="LikeButtonClick">
                                          <Button.Style>
                                            <Style BasedOn="{StaticResource LikeButtonStyle}" TargetType="Button">
                                              <Setter Property="Visibility" Value="Visible" />
                                              <Style.Triggers>
                                                <DataTrigger Binding="{Binding hasLiked}" Value="True">
                                                  <Setter Property="Visibility" Value="Collapsed" />
                                                </DataTrigger>
                                              </Style.Triggers>
                                            </Style>
                                          </Button.Style>
                                        </Button>
                                        <Button x:Name="RemoveLikeButton" VerticalAlignment="Center" Content="remove like" IsEnabled="{Binding hasLiked}" ToolTip="Remove Like" Click="RemoveLikeButtonClick">
                                          <Button.Style>
                                            <Style BasedOn="{StaticResource RemoveLikeButtonStyle}" TargetType="Button">
                                              <Setter Property="Visibility" Value="Visible" />
                                              <Style.Triggers>
                                                <DataTrigger Binding="{Binding hasLiked}" Value="False">
                                                  <Setter Property="Visibility" Value="Collapsed" />
                                                </DataTrigger>
                                              </Style.Triggers>
                                            </Style>
                                          </Button.Style>
                                        </Button>
                                    </StackPanel>

                                    </StackPanel>
                                </StackPanel>                               
                            </StackPanel>   
                    </StackPanel>
                            <StackPanel Orientation="Vertical">
                        <ListView Name="NewsFeedList" Width="700" Height="500" Margin="10"  
                                  ItemsSource="{Binding Source={x:Static local:Sidebar.newsFeedResourcesCoba2}}" 
                                  Background="Black" 
                                  ItemTemplateSelector="{StaticResource myDataTemplateSelector}" Focusable="False">                            
                        </ListView>
                    </StackPanel>                
                    </Grid>                 
                </DataTemplate>
        </ControlTemplate>

</UserControlTemplate>

</UserControl>

Тогда у меня есть класс, подобный этому

public class NewsFeedResources : System.Windows.Controls.UserControl, INotifyPropertyChanged

{       
        public event PropertyChangedEventHandler PropertyChanged;

        public string UserName { get; set; }
        public string Id { get; set; }
        public string Message { get; set; }
        public string IdPost { get; set; }
        public byte[] ProfilePict { get; set; }
        public string DestinationName { get; set; }
        public string to { get; set; }
        public byte[] UploadedPict { get; set; }
        public byte[] Attachment { get; set; }
        public string Description { get; set; }
        public string type { get; set; }
        public string nameWallPost { get; set; }
        public string captionWallPost { get; set; }
        public string link { get; set; }
        public byte[] icon { get; set; }
        public string attribution { get; set; }
        public bool canLike
    {
        get { return this.canLike; }
        set
        {
            if (this.canLike != value)
            {
                this.canLike = value;
                this.OnPropertyChanged("canLike");
            }
        }
    }
    public bool hasLiked
    {
        get { return this.hasLiked; }
        set
        {
            if (this.hasLiked != value)
            {
                this.hasLiked = value;
                this.OnPropertyChanged("hasLiked");
            }
        }
    }
    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }   

}

Вот что происходит, когда мы нажимаем кнопку LikeButton

    private void LikeButtonClick(object sender, RoutedEventArgs e)
    {

        Button btn = (Button)sender;
        NewsFeedResources obj = btn.DataContext as NewsFeedResources;
        if (null != obj)
        {
            //MessageBox.Show(obj.IdPost);
            webClient.DownloadString(obj.IdPost);
            obj.canLike = false;
            obj.hasLiked = true;
        }
    }

Я хочу спросить, как я могу автоматически превратить пользовательский интерфейс из Like в Unlike и наоборот, используя INotifyPropertyChanged, потому что в моем исходном коде он столкнулся с бесконечной ошибкой цикла на get {return this.canLike; }. Спасибо за помощь ребятам

Ответ 1

Я думаю, это потому, что у вас нет частной переменной, настроенной для canLike. Ваша добыча вызывает бесконечно.

Сделайте что-то вроде этого:

private bool _canLike;
public bool canLike
{
    get { return this._canLike; }
    set
    {
        if (this._canLike != value)
        {
            this._canLike = value;
            this.OnPropertyChanged("canLike");
        }
    }

Похоже, вы пытаетесь использовать подход с авто-имуществом, где неявно объявляется переменная private member:

public bool canLike { get; set; }

где вам нужно нормальное свойство (вместе с ним частная переменная-член).