即使在实现INotifyPropertyChanged事件后,绑定也不会更新 - C# - UWP

时间:2016-10-23 12:36:08

标签: c# html html-agility-pack inotifypropertychanged uwp-xaml

该问题已经过彻底修改,以更新我的工作。

[编辑]

我正在学习C#而我正在尝试解析" http://www.watchfree.to"使用Html-Agility-Pack进入我的UWP应用程序。我能够进行解析,并获得了我需要的内容。
我的应用程序绑定到GridView,并在那里显示某些内容的Images and Titles。我在我的x:Bind中使用了MainPage,但它只在第一次加载页面时更新内容,我已经实现了INotifyPropertyChanged事件,但仍然发生了同样的情况,内容不会更新时它改变。此外,图像不会在运行时更新,因为目前我必须先将它们下载到TempFolder,然后使用文件夹的Path作为字符串来显示图像。

我的代码文件如下:

MainPage.xaml中

//
<Page
x:Class="WatchfreeWebsite.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:WatchfreeWebsite"
xmlns:data="using:WatchfreeWebsite"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Loading="MainPage_Loading"
Loaded="MainPage_Loaded">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
      x:Name="mgrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
        <RowDefinition Height="AUto"/>
    </Grid.RowDefinitions>

    <StackPanel x:Name="PageHeader">
        <TextBlock Text="Watcfree.to"
                   TextAlignment="Center"
                   FontSize="20"
                   TextWrapping="Wrap"/>
        <TextBlock Text="Stream Movies and TV Shows"
                   TextAlignment="Center"
                   TextWrapping="Wrap"/>
        <ProgressRing x:Name="ProgRing"/>
        <TextBlock x:Name="nodeText"
                   Height="auto"
                   Width="auto"
                   TextAlignment="Center"
                   TextWrapping="Wrap"
                   />
    </StackPanel>
    <GridView Grid.Row="1"
              ItemsSource="{x:Bind MoviesList, Mode=OneWay}"
              x:Name="dataGrid"
              SelectionChanged="dataGrid_SelectionChanged">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="data:PopularMoviesClass">
                <StackPanel 
                            Margin="0,10,0,10">
                    <TextBlock Name="Title"
                               Text="{x:Bind MovieTitle, Mode=OneWay}"
                               TextAlignment="Center"
                               IsTextSelectionEnabled="True"
                               TextWrapping="Wrap"
                               Height="40"
                               Width="200"/>
                    <Image x:Name="CoverImage"
                           Source="{x:Bind ImageLink, Mode=OneWay}"
                           Width="180"
                           Height="250"/>
                </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
    <StackPanel Grid.Row="2"
                Margin="0,10,0,10"
                Orientation="Horizontal"
                HorizontalAlignment="Center">
        <Button x:Name="RefreshPageBtn"
                Content="Refresh Page"
                Click="RefreshPageBtn_Click"/>
        <Button x:Name="RefreshLayoutBtn"
                Content="Refresh Layout"

                Margin="10,0,0,0"
                Click="RefreshLayoutBtn_Click"/>
    </StackPanel>

</Grid>

MainPage.xaml.cs中

//
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using HtmlAgilityPack;
using System.Net.Http;
using Windows.Storage.Streams;
using Windows.Storage;
using System.Threading.Tasks;



namespace WatchfreeWebsite
{

public sealed partial class MainPage : Page
{
    public static string[] MoviesImageLinks = new string[30];
    public static string[] MoviesTitles = new string[30];
    public static string[] PageLinks = new string[30];
    //public static int[] MoviesIDs = new int[30];
    public static readonly string MoviesBaseLink = "http://watchfree.to";

    public static StorageFolder TempFolder = ApplicationData.Current.TemporaryFolder;
    public List<PopularMoviesClass> MoviesList;


    PopularMoviesClass MovieTitle = new PopularMoviesClass();
    PopularMoviesClass ImageLink = new PopularMoviesClass();

    public MainPage()
    {
        InitializeComponent();
        MovieTitle.PropertyChanged += MovieTitle_PropertyChanged;
        ImageLink.PropertyChanged += ImageLink_PropertyChanged;
        DataContext = MovieTitle;
        DataContext = ImageLink;
        //this.DataContextChanged += (s, e) => this.Bindings.Update();
    }

    private void ImageLink_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        Bindings.Update();
    }

    private void MovieTitle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        Bindings.Update();
    }

    private void MainPage_Loading(FrameworkElement sender, object args)
    {
        LoadPage();
        MoviesList = MovieManager.GetMovies();

    }

    private async void LoadPage()
    {
        try
        {

            nodeText.Text = "Connecting to server...";
            ProgRing.IsActive = true;
            string url = MoviesBaseLink;
            HtmlWeb webPage = new HtmlWeb();
            HtmlDocument doc = await webPage.LoadFromWebAsync(url);

            nodeText.Text = "Fetching links...";
            // finding image links in page
            IEnumerable<HtmlNode> _links = doc.DocumentNode.Descendants("img").Where(d => d.Attributes.Contains("src"));
            int LinkID = 0;
            foreach (var link in _links)
            {
                if (link != null)
                {
                    MoviesImageLinks[LinkID] = string.Format("http:{0}", link.Attributes["src"].Value);
                }
                LinkID++;
            }
            nodeText.Text = "Fetching titles...";
            // finding titles in page
            int LinkID2 = 0;
            IEnumerable<HtmlNode> _titles = doc.DocumentNode.Descendants("a").Where(t => t.Attributes.Contains("title"));
            foreach (var link in _titles)
            {
                if (link != null)
                {
                    if (link.InnerText != "WatchFree.to" && link.InnerText != "Movies" && link.InnerText != "TV Shows")
                    {
                        string x = link.GetAttributeValue("title", null);
                        x = x.Replace("Watch Putlocker", "");
                        x = x.Trim();
                        MoviesTitles[LinkID2] = x;
                        MovieTitle.MovieTitle = MoviesTitles[LinkID2];
                        LinkID2++;
                    }
                }
            }

            //TitleFile(MoviesTitles);

            nodeText.Text = "Fetching images...";
            // downloading images
            int LinkID3 = 0;
            foreach (var link in MoviesImageLinks)
            {
                if (link != null)
                {
                    DownloadImages(link, LinkID3);

                }
                LinkID3++;
            }
        }
        catch (Exception ex)
        {
            ErrorDialog(ex.Message);
        }
        finally
        {
            ProgRing.Visibility = Visibility.Collapsed;
            nodeText.Visibility = Visibility.Collapsed;
            //MoviesList = MovieManager.GetMovies();
        }

    }

    private async void DownloadImages(string url, int ID)
    {
        try
        {
            await TempFolder.CreateFolderAsync("CoverPics", CreationCollisionOption.OpenIfExists);
            var CoverPicFolder = await TempFolder.GetFolderAsync("CoverPics");
            var fileName = string.Format("MovieID_{0}.jpg", ID);

            var coverpic_file = await CoverPicFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
            HttpClient client = new HttpClient(); // Create HttpClient
            byte[] buffer = await client.GetByteArrayAsync(url); // Download file
            using (Stream stream = await coverpic_file.OpenStreamForWriteAsync())
            {
                stream.Write(buffer, 0, buffer.Length);
            }
        }
        catch (Exception ex)
        {
            ErrorDialog(ex.Message);
        }

    }

    private async void ErrorDialog(string error)
    {
        MessageDialog md = new MessageDialog(error);
        md.Title = "Handled Exception";
        md.Content = error;
        md.Commands.Add(new UICommand("Okay"));
        await md.ShowAsync();
    }

    private void RefreshPageBtn_Click(object sender, RoutedEventArgs e)
    {
        RefreshPage();
    }

    private void RefreshPage()
    {
        Frame.Navigate(typeof(MainPage));
        Frame.BackStack.Remove(Frame.BackStack.Last());
    }

    private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        ;
    }

    private async void TitleFile(string[] title)
    {
        try
        {
            var CoverPicFolder = await TempFolder.GetFolderAsync(@"CoverPics");
            var fileName = @"Movies_Titles.txt";
            var txtFile = await CoverPicFolder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);

            foreach(string line in title)
            {
                await FileIO.WriteTextAsync(txtFile, string.Format(@"{0}\n", line));
            }
        }
        catch(Exception ex)
        {
            ErrorDialog(ex.Message);
        }
    }

    private void RefreshLayoutBtn_Click(object sender, RoutedEventArgs e)
    {
        this.Bindings.Initialize();
        this.Bindings.Update();
    }
}
}

PopularMovies.cs(持有列表的类)

//
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

namespace WatchfreeWebsite
{
public class PopularMoviesClass : INotifyPropertyChanged
{
    private int _MovieID;
    private string _MovieTitle;
    private string _ImageLink;

    public int MovieID
    {
        get { return _MovieID; }
        set
        {
            if (_MovieID != value)
            {
                _MovieID = value;
                OnPropertyChanged();
            }
        }
    }

    public string MovieTitle
    {
        get { return _MovieTitle; }
        set
        {
            if (_MovieTitle != value)
            {
                _MovieTitle = value;
                OnPropertyChanged();
            }
        }
    }

    public string ImageLink
    {
        get { return _ImageLink; }
        set
        {
            if (_ImageLink != value)
            {
                _ImageLink = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    //Image img = new Image();
    //img.Source = new BitmapImage(new Uri("ms-appx:///Assets/Logo.png"));

    protected void OnPropertyChanged([CallerMemberName] string setting = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(setting));
    }

}

public class MovieManager
{

    public static List<PopularMoviesClass> GetMovies()
    {
        var movies = new List<PopularMoviesClass>();
        string ImagePath = string.Format(@"{0}/CoverPics/", MainPage.TempFolder.Path);


        movies.Add(new PopularMoviesClass { MovieID = 1, MovieTitle = MainPage.MoviesTitles[0], ImageLink = ImagePath + "MovieID_0.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 2, MovieTitle = MainPage.MoviesTitles[1], ImageLink = ImagePath + "MovieID_1.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 3, MovieTitle = MainPage.MoviesTitles[2], ImageLink = ImagePath + "MovieID_2.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 4, MovieTitle = MainPage.MoviesTitles[3], ImageLink = ImagePath + "MovieID_3.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 5, MovieTitle = MainPage.MoviesTitles[4], ImageLink = ImagePath + "MovieID_4.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 6, MovieTitle = MainPage.MoviesTitles[5], ImageLink = ImagePath + "MovieID_5.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 7, MovieTitle = MainPage.MoviesTitles[6], ImageLink = ImagePath + "MovieID_6.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 8, MovieTitle = MainPage.MoviesTitles[7], ImageLink = ImagePath + "MovieID_7.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 9, MovieTitle = MainPage.MoviesTitles[8], ImageLink = ImagePath + "MovieID_8.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 10, MovieTitle = MainPage.MoviesTitles[9], ImageLink = ImagePath + "MovieID_9.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 11, MovieTitle = MainPage.MoviesTitles[10], ImageLink = ImagePath + "MovieID_10.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 12, MovieTitle = MainPage.MoviesTitles[11], ImageLink = ImagePath + "MovieID_11.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 13, MovieTitle = MainPage.MoviesTitles[12], ImageLink = ImagePath + "MovieID_12.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 14, MovieTitle = MainPage.MoviesTitles[13], ImageLink = ImagePath + "MovieID_13.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 15, MovieTitle = MainPage.MoviesTitles[14], ImageLink = ImagePath + "MovieID_14.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 16, MovieTitle = MainPage.MoviesTitles[15], ImageLink = ImagePath + "MovieID_15.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 17, MovieTitle = MainPage.MoviesTitles[16], ImageLink = ImagePath + "MovieID_16.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 18, MovieTitle = MainPage.MoviesTitles[17], ImageLink = ImagePath + "MovieID_17.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 19, MovieTitle = MainPage.MoviesTitles[18], ImageLink = ImagePath + "MovieID_18.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 20, MovieTitle = MainPage.MoviesTitles[19], ImageLink = ImagePath + "MovieID_19.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 21, MovieTitle = MainPage.MoviesTitles[20], ImageLink = ImagePath + "MovieID_20.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 22, MovieTitle = MainPage.MoviesTitles[21], ImageLink = ImagePath + "MovieID_21.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 23, MovieTitle = MainPage.MoviesTitles[22], ImageLink = ImagePath + "MovieID_22.jpg" });
        movies.Add(new PopularMoviesClass { MovieID = 24, MovieTitle = MainPage.MoviesTitles[23], ImageLink = ImagePath + "MovieID_23.jpg" });

        return movies;
    }
}
}

我可以在使用Titles解析后更新Page Refresh,但如果图像已经可用,则图像仍然无法更新。我必须关闭应用程序并再次运行它以更新图像。

有人可以解释我在这里做错了什么吗?上面提供了所有代码。它可以在VS Community 2015中复制和运行。

0 个答案:

没有答案