решено
Были некоторые очевидные ошибки, на которые указал Клеменс, спасибо за это.Однако именно эти неуместные символы }">
в моем файле 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
Спасибо.