この問題は簡単に解決できるかもしれませんが、コマンドを viewModel から xaml ビュー ファイルにバインドする際に重大な問題が発生しています。ご想像のとおり、このアプリケーションは MVVM デザイン パターンに基づいており、現在 2 つのウィンドウ (2 つの XAML ファイル) と 2 つのビューモデル (cs ファイル) があります。
MainWindow.xaml は、すべてのコマンドが ICommand オブジェクトとして格納される MainViewModel にバインドされます。すべてが正常に機能し、すべてのボタンが機能し、viewModel でバインドされているコマンドに到達します。1 つのボタンで、MultipleQuizViewModel.cs という新しい ViewModel にバインドされる MultipleQuizWindow.xaml という新しいウィンドウが作成されますが、ここからが楽しみの始まりです。ボタンはラベルとして使用されるコンテンツを見つけることができ、コマンドも見つけることができるように見えます (実行時に出力メニューにエラーはありません) が、ボタンをクリックしても何も起こりませんか? ほとんどすべてを試しましたが、実行せずに ICommand を見つけることができる理由のアイデアが不足し始めています。これは、新しいウィンドウを作成するボタンのコードです。
(MainViewModel.cs)
public void StartQuiz() {
MultipleQuizWindow newWindow = new MultipleQuizWindow(this);
newWindow.Show();
}
次に、新しい Window が呼び出され、特定の viewModel が MainViewModel をコンストラクターへの引数として取得します。
MultipleQuizWindow.xaml.cs
public partial class MultipleQuizWindow : Window {
public MultipleQuizViewModel vmQuiz;
public MultipleQuizWindow(MainViewModel mvm) {
InitializeComponent();
vmQuiz = new MultipleQuizViewModel(mvm);
this.DataContext = vmQuiz;
}
}
次に、ウィンドウを設計するための xaml コードが続きます。
MultipleQuizWindow.xaml
<Window x:Class="VocApp.View.MultipleQuizWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:view="clr-namespace:VocApp.View"
xmlns:viewmodel="clr-namespace:VocApp.ViewModel"
Title="MultipleQuizWindow" Height="300" Width="300">
<Grid Name="Grid1">
<Grid.RowDefinitions>
<RowDefinition Height="56*" />
<RowDefinition Height="43*" />
<RowDefinition Height="43*" />
<RowDefinition Height="43*" />
<RowDefinition Height="43*" />
<RowDefinition Height="42*" />
</Grid.RowDefinitions>
<Button Content="{Binding Ans1}" Name="Answer1" HorizontalAlignment="Left" Margin="108,10,0,0" Grid.Row="1" VerticalAlignment="Top" Width="75" Height="22" Command="{Binding Ans1Command}"/>
<Button Command="{Binding Ans2Command}" Content="{Binding Ans2}" Name="Answer2" HorizontalAlignment="Left" Margin="108,10,0,0" Grid.Row="2" VerticalAlignment="Top" Width="75" Height="22"/>
<Button Command="{Binding Ans3Command}" Content="{Binding Ans3}" Name="Answer3" HorizontalAlignment="Left" Margin="108,10,0,0" Grid.Row="3" VerticalAlignment="Top" Width="75" Height="22"/>
<Button Command="{Binding Ans4Command}" Content="{Binding Ans4}" Name="Answer4" HorizontalAlignment="Left" Margin="108,13,0,0" Grid.Row="4" VerticalAlignment="Top" Width="75" Height="22"/>
<Button Command="{Binding StartQuizCommand}" Content="{Binding Ans5}" Name="Answer5" HorizontalAlignment="Left" Margin="108,10,0,0" Grid.Row="5" VerticalAlignment="Top" Width="75" Height="22"/>
<TextBlock Text="{Binding Text}" Name="QuestionBox" HorizontalAlignment="Left" Margin="32,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" RenderTransformOrigin="-1.48,-0.688" Height="36" Width="220"><Run Language="da-dk" Text=""/></TextBlock>
</Grid>
そして最後に、ウィンドウがバインドされているviewModelが来ます(ボタンがバインドされているコンテンツを見つけることができますが、ICommandsは見つけられないことに注意してください)
MultipleQuizViewModel
public class MultipleQuizViewModel : ViewModelBase {
internal MainViewModel mvm;
private string ans1;
public string Ans1 {
get {
return ans1;
}
set {
ans1 = value;
}
}
private string ans2;
public string Ans2 {
get {
return ans2;
}
set {
ans2 = value;
}
}
private string ans3;
public string Ans3 {
get {
return ans3;
}
set {
ans3 = value;
}
}
private string ans4;
public string Ans4 {
get {
return ans4;
}
set {
ans4 = value;
}
}
private string ans5;
public string Ans5 {
get {
return ans5;
}
set {
ans5 = value;
}
}
private string text;
public string Text {
get {
return text;
}
set {
text = value;
}
}
MultipleQuiz Quiz;
public ICommand Ans1Command { get; private set; }
public ICommand Ans2Command { get; private set; }
public ICommand Ans3Command { get; private set; }
public ICommand Ans4Command { get; private set; }
public ICommand Ans5Command { get; private set; }
public MultipleQuizViewModel(MainViewModel mvm) {
this.mvm = mvm;
this.Quiz = mvm.model.GenerateQuiz() as MultipleQuiz;
string[] words = Quiz.AllAnswers;
text = "Please translate the word " + Quiz.word.Wordstring;
ans1 = words[0];
ans2 = words[1];
ans3 = words[2];
ans4 = words[3];
ans5 = words[4];
Ans1Command = new RelayCommand(Answer1);
Ans2Command = new RelayCommand(Answer2);
Ans3Command = new RelayCommand(Answer3);
Ans4Command = new RelayCommand(Answer4);
Ans5Command = new RelayCommand(Answer5);
}
public void Answer1() {
text = "please work";
if (Quiz.ansIndex == 1) {
text = "correct!";
}
else {
text = "wrong!";
}
}
public void Answer2() {
if (Quiz.ansIndex == 2) {
text = "correct!";
}
else {
text = "wrong!";
}
}
public void Answer3() {
if (Quiz.ansIndex == 3) {
text = "correct!";
}
else {
text = "wrong!";
}
}
public void Answer4() {
if (Quiz.ansIndex == 4) {
text = "correct!";
}
else {
text = "wrong!";
}
}
public void Answer5() {
if (Quiz.ansIndex == 5) {
text = "correct!";
}
else {
text = "wrong!";
}
}
}
そこには大量のコードがあることは知っていますが、誰かが何が悪かったのか教えてくれることを本当に願っています. コマンドが実行されないことは明らかですが、Visual Studio は xaml のバインディングを通じてコマンドを見つけることができます。
このプロジェクトでは GalaSoft を使用しています。
正しい方向に私を導くことができるヒントを与えるかもしれない人に前もって感謝します:)