[英]Binding RelayCommand not executing
抱歉我的問題可能很愚蠢,但我無法解決:現在我已經編寫了一個菜單的UserControl,並且有一個關於打開一個項目的命令(我使用EventtoCommand將它切換到一個事件OpenProject),這個UserControl運行良好它,這是MainWindow.xaml中的代碼
<uc:MenuControl Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3"
DataContext="{Binding Menu}"
ProjectExist="{Binding ProjectExist}"
Path="{Binding SelectedPath}"
HistorySource="{Binding HistorySource}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="NewProject">
<command:EventToCommand Command="{Binding NewProjectHandle}"></command:EventToCommand>
</i:EventTrigger>
<i:EventTrigger EventName="ProjectConfig">
<command:EventToCommand Command="{Binding ProjectConfigHandle}"></command:EventToCommand>
</i:EventTrigger>
<i:EventTrigger EventName="OpenProject">
<command:EventToCommand Command="{Binding OpenProjectHandle}"></command:EventToCommand>
</i:EventTrigger>
<i:EventTrigger EventName="OpenHistory">
<command:EventToCommand Command="{Binding OpenHistoryHandle}"></command:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
</uc:MenuControl>
您看到我已將Event OpenProject綁定到名為OpenProjectHandle的RelayCommand,這是MenuViewModel中的代碼:
public MenuViewModel()
{
OpenProjectHandle = new RelayCommand(() =>
{
//OpenProject
});
}
當然我已經定義了OpenProjectHandle,但是當我調試時我可以看到程序提升事件OpenProject,但OpenProjectHandle沒有激動,任何人都知道哪里出錯了?
================================================== ==========這是OpenProjectHandle:
_projectConfig = ProjectConfigModel.Instance();
HistorySource = new ObservableCollection<HistorySection>();
XmlDocument HisFile = new XmlDocument();
HisFile.Load("D:\\history");
XmlNode Projects = HisFile.SelectSingleNode("Project");
XmlNodeList paths = Projects.ChildNodes;
foreach (XmlNode path in paths) {
HistorySource.Add(new HistorySection(path.InnerText));
}
OpenProjectHandle = new RelayCommand(() =>
{
OpenFileDialog dialog = new OpenFileDialog()
{
Title = "請選擇工程文件",
Filter = "工程文件(*.project)|*.project"
};
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
_projectConfig.Path = dialog.FileName;
}
else {
return;
}
XmlDocument ProjFile = new XmlDocument();
ProjFile.Load(_projectConfig.Path);
XmlNode root = ProjFile.SelectSingleNode("Project");
XmlNode database = root.SelectSingleNode("DataBase");
XmlNode resource = root.SelectSingleNode("Resource");
_projectConfig.ProjectName = getValue(root, "Name");
_projectConfig.ProjectPath = getValue(root, "ProjectPath");
_projectConfig.DatabaseIP = getValue(database, "DataBaseIP");
_projectConfig.DatabasePort = getValue(database, "DataBasePort");
_projectConfig.DatabaseName = getValue(database, "DataBaseName");
_projectConfig.DatabaseUserName = getValue(database, "DataBaseUserName");
_projectConfig.DatabasePassword = getValue(database, "DataBasePassword");
_projectConfig.MapSourcePath = getValue(resource, "MapSourcePath");
_projectConfig.MapSourceOutputPath = getValue(resource, "MapSourceOutputPath");
_projectConfig.NpcPicturePath = getValue(resource, "NpcPicturePath");
_projectConfig.MonsterPicturePath = getValue(resource, "MonsterPicturePath");
_projectConfig.MapSoundPath = getValue(resource, "MapSoundPath");
HisFile.Load("D:\\history");
Projects = HisFile.SelectSingleNode("Project");
Paths = InProjects.ChildNodes;
bool existed = false;
foreach (XmlNode path in Paths) {
if (path.InnerText == _projectConfig.Path) {
existed = true;
}
}
if (!existed) {
XmlNode xmle = HisFile.CreateElement("Path");
xmle.InnerText = _projectConfig.Path;
Projects.AppendChild(xmle);
}
HisFile.Save("D:\\history");
ProjectExist = true;
ProjectConfigModel.SetCurrentInstance();
ProjectConfigModel.SetNewInstance();
string getValue(XmlNode father, string str) {
return father.SelectSingleNode(str).InnerText;
}
});
所有這些都在public MenuViewModel()
的public MenuViewModel()
構造函數中
這個問題是MVVMLight的一個bug,我們不能使用RelayCommand中未定義的變量(我使用過MenuViewModel定義的XmlDocument)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.