Как мне сделать обновление списка после загрузки данных XML? - PullRequest
0 голосов
/ 27 сентября 2019

решено

Были некоторые очевидные ошибки, на которые указал Клеменс, спасибо за это.Однако именно эти неуместные символы }"> в моем файле xaml разрушили все для меня.

ПРОБЛЕМА

Если кто-нибудь знает способ заставить Visual Studio перехватить и сообщить об этих ошибках, пожалуйста, дайте мне знать об этом.В противном случае, спасибо за ваше время: -)

У меня есть файл XML, который я импортирую в свою программу.Эти данные затем сохраняются в observableCollection, которая, как я надеялся, была правильно связана с моим ListView.

Однако, несмотря на то, что я сделал импорт, я просто не могу заставить данные представить себя в ListView после добавления в список.

Я просмотрел весь Google, пытался переписать все, основываясь на примерах, которые, как я знал, сработал, и все же я не смог разобраться.

Я считаю, что ошибка находится где-то между этими пятью файлами:

MainWindowView xaml cs

public partial class MainWindowView : Window
{
    private EventViewModel eventViewModel;
    private MainWindowViewModel mainWindowViewModel;
    private String xmlFilePath;


    public MainWindowView()
    {
        InitializeComponent();
        this.eventViewModel = new EventViewModel();
        this.mainWindowViewModel = new MainWindowViewModel();
        this.DataContext = this.eventViewModel;
    }

    private void importButton(object sender, RoutedEventArgs e)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Filter = "XML Files (*.xml)|*.xml";
        if (openFileDialog.ShowDialog() == true)
        {
            xmlFilePath = openFileDialog.FileName;
        }
        this.mainWindowViewModel.Validator(xmlFilePath);

    }
    private void exportButton(object sender, RoutedEventArgs e)
    {
        this.mainWindowViewModel.exportResultToCSV(xmlFilePath);
    }
}

MainWindowView xaml

<Window x:Class="SportDataProject.MainWindowView"
        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:local="clr-namespace:SportDataProject"
        mc:Ignorable="d"
        Title="MainWindow" Height="600" Width="1240"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <Grid Height="500" Width="1200" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"></RowDefinition>
            <RowDefinition Height="0.5*"></RowDefinition>
            <RowDefinition Height="1*"></RowDefinition>
            <RowDefinition Height="0.5*"></RowDefinition>
            <RowDefinition Height="1*"></RowDefinition>
            <RowDefinition Height="0.5*"></RowDefinition>
            <RowDefinition Height="1*"></RowDefinition>
            <RowDefinition Height="0.5*"></RowDefinition>
            <RowDefinition Height="1*"></RowDefinition>
            <RowDefinition Height="0.5*"></RowDefinition>
            <RowDefinition Height="1*"></RowDefinition>
            <RowDefinition Height="1.5*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.5*"></ColumnDefinition>
            <ColumnDefinition Width="1*"></ColumnDefinition>
            <ColumnDefinition Width="0.5*"></ColumnDefinition>
            <ColumnDefinition Width="2*"></ColumnDefinition>
            <ColumnDefinition Width="0.5*"></ColumnDefinition>
            <ColumnDefinition Width="2*"></ColumnDefinition>
            <ColumnDefinition Width="0.5*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <StackPanel HorizontalAlignment="Center" Grid.Column="3" Grid.Row="0">
            <Button Content="Find and Import XML File" HorizontalAlignment="Center" Margin="30,0,30,0" VerticalAlignment="Center" Width="160" Click="importButton" Height="35"/>
        </StackPanel>
        <StackPanel HorizontalAlignment="Center" Grid.Column="5" Grid.Row="0">
            <Button Content="Export result" HorizontalAlignment="Center"  VerticalAlignment="Center" Width="160" Click="exportButton" Height="35"/>
        </StackPanel>
        <Label Grid.Row="2" Grid.Column="1" Content="Sport: " FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="2" Grid.Column="2" Content="{Binding Sport}" DataContext="{Binding ThisEvent}" FontSize="10" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="4" Grid.Column="1" Content="Tournament: " FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="27,6,71,6" Width="90"/>
        <Label Grid.Row="4" Grid.Column="2" Content="{Binding EventName}" DataContext="{Binding ThisEvent}" FontSize="10" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="6" Grid.Column="1" Content="Stage: " FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="6" Grid.Column="2" Content="{Binding EventName}" DataContext="{Binding ThisEvent}" FontSize="10" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="8" Grid.Column="1" Content="Distance: " FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="8" Grid.Column="2" Content="{Binding EventName}" DataContext="{Binding ThisEvent}" FontSize="10" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="10" Grid.Column="1" Content="Date: " FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="10" Grid.Column="2" Content="{Binding EventName}" DataContext="{Binding ThisEvent}" FontSize="10" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <ListView Grid.Row="2" Grid.Column="3" Grid.ColumnSpan="3" Grid.RowSpan="9"  ItemsSource="{Binding ListOfCyclists}" >
}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" Width="230" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Header="Gender" Width="200" DisplayMemberBinding="{Binding Gender}" />
                    <GridViewColumn Header="Country" Width="100" DisplayMemberBinding="{Binding Country}" />
                    <GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Gender}" />
                    <GridViewColumn Header="Position" Width="100" DisplayMemberBinding="{Binding Country}" />
                </GridView>
            </ListView.View>
        </ListView>
        <TextBox Grid.Row="11" Grid.Column="3"  TextWrapping="Wrap" Text="Enter a name" VerticalAlignment="Center" Height="26" Width="195" TextChanged="searchBoxName" FontSize="12" HorizontalAlignment="Center" TextAlignment="Center" Margin="0,22,0,10"/>
        <TextBox Grid.Row="11" Grid.Column="5"  TextWrapping="Wrap" Text="Enter a race position" VerticalAlignment="Center" Height="26" Width="194" TextChanged="searchBoxPosition" FontSize="12" HorizontalAlignment="Center" TextAlignment="Center" Margin="1,22,0,10"/>
        <Label Grid.Row="11" Grid.Column="1" Content="Search options:" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16"/>

    </Grid>
</Window>

MainWindowViewModel

class MainWindowViewModel : Bindable
{
    private Event sportsEvent;

    public void exportResultToCSV(String xmlFilePath)
    {
        string output = xmlFilePath.Substring(0, xmlFilePath.Length - 4) + "-new.xml";
        List<Cyclist> listOfRiders = new List<Cyclist>();

        if (sportsEvent == null)
        {
            this.sportsEvent = new Event();
            this.sportsEvent.loadTestData();
        }

        foreach (Cyclist rider in sportsEvent.ListOfCyclists)
        {
            listOfRiders.Add(rider);
        }

        foreach (Cyclist rider in listOfRiders)
        {
            Console.WriteLine(rider.Name);
        }

        XmlSerializer serialiser = new XmlSerializer(typeof(List<Cyclist>));
        TextWriter FileStream = new StreamWriter(output);
        serialiser.Serialize(FileStream, listOfRiders);
        FileStream.Close();
    }

    public Event thisEvent
    {
        get { return sportsEvent; }
        set { sportsEvent = value; this.propertyIsChanged(); }
    }

    public void printList()
    {
        foreach (var cyclist in sportsEvent.ListOfCyclists)
        {
            Console.WriteLine(cyclist.Name);
        }
    }
    public void Validator(String xmlFilePath)
    {
        this.sportsEvent = new Event();
        string fileName = Path.GetFileName(xmlFilePath);
        XmlReaderSettings settings = new XmlReaderSettings();

        settings.DtdProcessing = DtdProcessing.Parse;
        settings.ValidationType = ValidationType.DTD;
        settings.XmlResolver = new XmlUrlResolver();
        settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(ValidationCallBack);
        settings.IgnoreWhitespace = true;
        Console.WriteLine(xmlFilePath);
        XmlReader reader = XmlReader.Create(fileName, settings);

        // Parse the file.
        while (reader.Read())
        {
            ParseToList(fileName);
            reader.Close();
        }
        Console.WriteLine("Finished");

    }

    private void ValidationCallBack(object sender, System.Xml.Schema.ValidationEventArgs e)
    {
        if (e.Severity == System.Xml.Schema.XmlSeverityType.Warning)
            Console.WriteLine("Warning: Matching schema not found.  No validation occurred." + e.Message);
        else // Error
            Console.WriteLine("Validation error: " + e.Message);
    }


    public void ParseToList(String fileName)
    {
        this.sportsEvent = new Event();

        var xml = XDocument.Load(fileName);

        String name;
        String gender;
        String country;
        String result = "";
        String rank = "";
        foreach (var participant in xml.Descendants("event_participant"))
        {
            String ID = (String)participant.Attribute("id");
            name = (String)participant.Element("participant").Attribute("name");
            gender = (String)participant.Element("participant").Attribute("gender");
            country = (String)participant.Element("participant").Attribute("countryFK");
            foreach (var time in xml.Descendants("result").Where(x => (String)x.Attribute("result_typeFK") == "101" && (String)x.Attribute("event_participantsFK") == ID))
            {
                result = (String)time.Attribute("value");

                foreach (var placement in xml.Descendants("result").Where(x => (String)x.Attribute("result_typeFK") == "100" && (String)x.Attribute("event_participantsFK") == ID))
                {
                    rank = (String)placement.Attribute("value");
                }

            }
            //Console.WriteLine(name + ", " + gender + ", " + country + ", " + result + ", " + rank);

            if (name != "Peloton")
            {
                sportsEvent.ListOfCyclists.Add(new Cyclist() { Name = name, Gender = gender, Country = country, Result = result, Position = rank });
            }
        }

    }

}

Событие

namespace SportDataProject.Model
 {
class Event : Bindable
{
    private ObservableCollection<Cyclist> listOfCyclist;

    public ObservableCollection<Cyclist> ListOfCyclists
    {
        get { return listOfCyclist; }
        set { listOfCyclist = value; this.propertyIsChanged(); }
    }
    public Event()
    {
        listOfCyclist = new ObservableCollection<Cyclist>();
    }

    private String sport;
    private String tournamentTemplateId;
    private String gender;
    private String eventName;
    private String yearOfEvent;
    private String tournamentId;
    private String eventId;
    private DateTime eventDate;

    public String Sport { get { return sport; } set { sport = value; this.propertyIsChanged(); } } //<sport name="Cycling" enetSportCode="cy"...
    public String TournamentTemplateId { get { return tournamentTemplateId; } set { tournamentTemplateId = value; this.propertyIsChanged(); } } //<tournament_template name="Tour de France 1" sportFK="30" gender="male" enetID="0" del="no" n="1" ut="2012-05-22 11:20:50" id="8844">
    public String Gender { get { return gender; } set { gender = value; this.propertyIsChanged(); } } //<tournament_template name = "Tour de France 1" sportFK="30" gender="male"
    public String EventName { get { return eventName; } set { eventName = value; this.propertyIsChanged(); } } // <tournament_stage name="Tour de France"
    public String YearOfEvent { get { return yearOfEvent; } set { yearOfEvent = value; this.propertyIsChanged(); } } // <tournament name="2011"
    public String TournamentId { get { return tournamentId; } set { tournamentId = value; this.propertyIsChanged(); } } //<tournament name="2011" tournament_templateFK="8844" enetSeasonID="0" del="no" locked="none" n="0" ut="2010-12-15 16:24:21" id="5830">
    public String EventIdNumber { get { return eventId; } set { eventId = value; this.propertyIsChanged(); } } //<event name="Stage 1" tournament_stageFK="822493" startdate="2011-07-02 13:05:00" eventstatusFK="0" status_type="finished" status_descFK="6" enetID="0" enetSportID="cy" del="no" locked="no" n="5" ut="2011-07-02 18:22:30" id="956268">
    public DateTime EventDate { get { return eventDate; } set { eventDate = value; this.propertyIsChanged(); } }


    public void loadTestData()
    {
        this.Sport = "Cycling";
        this.TournamentTemplateId = "10";
        this.Gender = "Male";
        this.EventName = "Tour De France";
        this.YearOfEvent = "2011";
        this.TournamentId = "256";
        this.EventIdNumber = "2485795";
        this.EventDate = DateTime.Parse("2011-07-02 13:05:00");

        this.ListOfCyclists.Add(new Cyclist() { Name = "Felix", Gender = "Male", Country = "Denmark", Result = "+0:02", Position = "2" });
        this.ListOfCyclists.Add(new Cyclist() { Name = "Rudolf", Gender = "Male", Country = "Holland", Result = "+0:07", Position = "5" });
        this.ListOfCyclists.Add(new Cyclist() { Name = "Nikola", Gender = "Male", Country = "Italy", Result = "+0:35", Position = "23" });




    }

}
}

Велосипедист cs

public class Cyclist : Bindable
{
    private String name;
    private String gender;
    private String country;
    private String result;
    private String position;
    public String Name { get { return name; } set { name = value; this.propertyIsChanged(); } }
    public String Gender { get { return gender; } set { gender = value; this.propertyIsChanged(); } } //eventFK="956268"
    public String Country { get { return country; } set { country = value; this.propertyIsChanged(); } } //enetID
    public String Result { get { return result; } set { result = value; this.propertyIsChanged(); } } // gender
    public String Position { get { return position; } set { position = value; this.propertyIsChanged(); } } // countryFK



    public Cyclist()
    {

    }

    public Cyclist(Cyclist cyclist)
    {
        this.name = cyclist.Name;
        this.gender = cyclist.Gender;
        this.country = cyclist.Country;
        this.result = cyclist.Result;
        this.position = cyclist.Position;
    }

}
}

Я надеялся, что когда файл XML будет проверен и добавлен в ObservableList, то ListView будет автоматическиОбновить.

Я проверял, что импорт выполнен правильно, поскольку я могу распечатать каждое ожидаемое значение списка в цикле foreach.

Я скрещиваю пальцы, чтобы вы научили меня, как это исправить.Возможно, научите меня кое-чему о привязках, потому что ясно, что я не могу их решить: S

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...