簡體   English   中英

綁定RelayCommand不執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM