2013-06-01 44 views
0

我试图在Windows 8中使用MVVM设计模式做一个简单的测验程序。我试图使用PRISM和MVVMlite,但是我是一个新手,根本没有足够的数据和控制绑定知识来理解如何正确使用它。我认为我的大部分工作正在进行,但我有一些主要问题。 1.我的GUI不能正确更新。 2.我收到几个错误。 3.修复我的代码的一部分打破了另一部分。 4.无法弄清楚如何从XAML中的命令获取“发件人”信息。Windows 8 C#到XAML数据绑定问题,GUI不更新

这里是到目前为止我的代码:

XML数据:

<root> 
    <Object> 
    <Question>What do you do for work</Question> 
    <Answer>Wrestle giant tentical monsters</Answer> 
    <Choices>Battle robots</Choices> 
    <Choices>Glorious ruler of North Korea</Choices> 
    <Choices>Wrestle Giant Tentical Monsters</Choices> 
    <Choices>Defender of all that is good</Choices> 
    </Object> 

    <Object> 
    <Question>What do you drive</Question> 
    <Answer>Moped</Answer> 
    <Choices>Helicopter</Choices> 
    <Choices>Pegasus</Choices> 
    <Choices>Rocketship</Choices> 
    <Choices>Moped</Choices> 
    </Object> 
</root> 

型号:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.ComponentModel; 
using System.Xml.Linq; 
using System.Windows.Input; 

namespace Quiz 
    { 
    class QuizModel : INotifyPropertyChanged 
    { 
     private string _question; 
     public string Question 
     { 
      get { return _question; } 
      set 
      { 
       _question = value; 
       OnPropertyChanged("Question"); 
      } 
     } 

     private string _answer; 
     public string Answer 
     { 
      get { return _answer; } 
      set 
     { 
      _answer = value; 
      OnPropertyChanged("Answer"); 
     } 
    } 

    private List<string> _choices; 
    public List<string> Choices 
    { 
     get { return _choices; } 
     set 
     { 
      _choices = value; 
      OnPropertyChanged("Choices"); 
     } 
    } 

    public QuizModel(string quesiton, string answer, List<string> choices) 
    { 
     Question = quesiton; 
     Answer = answer; 
     Choices = choices; 
    } 

    public static List<QuizModel> Query(string datasource) 
    { 
     XElement quizdata = XElement.Load(datasource); 
     List<QuizModel> query = (from d in quizdata.Descendants("Object") 
           select new QuizModel(
              (string)d.Element("Question"), 
              (string)d.Element("Answer"), 
              d.Elements("Choices").Select(a => a.Value).ToList() 
              )).ToList(); 
     return query; 
    } 

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

视图模型:

class QuizViewModel 
{ 
    public static List<QuizModel> QuizList { get; set; } 
    public static QuizModel Quiz { get; set; } 
    public static int Indexer { get; set; } 
    public ICommand myCommand { get; set; } 

    //Initiallizes view model 
    public QuizViewModel() 
    { 
     Indexer = 0; 
     QuizList = QuizModel.Query("Quiz.xml"); 
     Quiz = QuizList[Indexer]; 
     myCommand = new ActionCommand(Evaluate); 
    } 

    //Increments to next question 
    private void Evaluate() 
    { 
     Indexer++; 
     Quiz = QuizList[Indexer]; 
    } 
} 

的ICommand:

public class ActionCommand : ICommand 
{ 
    private readonly Action _action; 
    public ActionCommand(Action action) 
    { 
     _action = action; 
    } 

    public void Execute(object parameter) 
    { 
     _action(); 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; //ERROR event Never Used 
} 

} 

检视:

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*"/> 
     <RowDefinition Height="3*"/> 
    </Grid.RowDefinitions> 
    <TextBlock FontSize="50" Text="{Binding Quiz.Question}"> 
     <TextBlock.DataContext> 
      <local:QuizViewModel/> <!--Can't find Quiz.xml--> 
     </TextBlock.DataContext> 
    </TextBlock> 

    <ListView Grid.Row="1" FontSize="30" ItemsSource="{Binding Quiz.Choices}"> 
     <ListView.DataContext> 
      <local:QuizViewModel/> <!--Can't find Quiz.xml--> 
     </ListView.DataContext> 

     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Button Content="{Binding Mode=OneWay}" Command="{Binding myCommand}"> 
        <Button.DataContext> 
         <local:QuizViewModel/> 
        </Button.DataContext> 
       </Button> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

我有3个电流误差2,其是相同的 第一个错误是指在XAMLs的datacontext:

错误1(×2)
找不到文件'C:\ Users \ Me \ AppData \ Local \ Microsoft \ VisualStudio \ 11.0 \ Designer \ ShadowCache \ cv0te54x.fpv \ 5ncl4yxi.hui \ Quiz.xml'。

错误2 无法创建类型为“Quiz.QuizViewModel”

这似乎影响了我的“选择”不填充,我可以通过删除数据方面解决这个问题,但我不能结合“的实例myCommand“

第三个问题是我如何从命令输入发件人信息,以便我可以评估它是对还是错?

回答

0

看看错误#1,你的代码找不到Quiz.xml文件,它正在错误描述的位置查找它。看起来它看着错误的位置,所以你可能必须指定一个更具体的路径。 This问题可能会有所帮助,如果你有资源中的xml文件。因为这是在Quiz.QuizViewModel构造函数中完成的,所以创建实例失败并产生错误#2。

至于第三部分,您可以传递任意参数的命令。在这种情况下,它可能是选择或其位置。 Something like this

+0

那么它最初填充,它只是不会更新到下一个选择。我试图让这条路更加具体,但是当我这样做的时候,它抛出了许多错误。我现在把它设置为内容,我尝试了嵌入式资源,但这并不起作用。我会尝试你的想法来解决第三个问题。谢谢 – evilsushi

+0

任何关于如何使我的路径更具体的“Quiz.xml”的建议。它目前在源代码目录中,所以我没有办法让它更具体。 – evilsushi