执行ICommand时,属性设置为null

时间:2014-01-21 00:09:44

标签: c# mvvm mvvm-light nullreferenceexception

我有这个非常简单的代码,据我所知,我在我的程序中使用它。

using CompetitionManager.DataAccess;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System.Windows;
using System.Windows.Input;

namespace CompetitionManager.ViewModel.CompetitionSetup
{
    public class AthleteListViewModel : ViewModelBase
    {
        private Athlete selectedAthlete;

        public ICommand AddAthleteCommand { get; private set; }

        public AthleteListViewModel()
        {
            AddAthleteCommand = new RelayCommand(() => ExecuteAddAthleteCommand());
        }

        public Athlete SelectedAthlete
        {
            get
            {
                return selectedAthlete;
            }
            set
            {
                if (selectedAthlete == value)
                    return;
                selectedAthlete = value;
                RaisePropertyChanged("SelectedAthlete");
            }
        }

        private void ExecuteAddAthleteCommand()
        {
            try
            {
                MessageBox.Show(SelectedAthlete.Id.ToString());
            }
            catch (System.Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
    }
}

我尝试将ComboBox的SelectedValue绑定到SelectedAthlete,但没有任何反应,所以我决定尝试使用后面的代码。

如果我在设置时打印出SelectedAthlete的值,即在selectedAthlete = value行之后,我会得到一个正确的值,但是当ICommand启动时,我会设置selectedAthlete的时间为空。

我在用户控件后面的代码中设置了SelectedAthlete的值,就像cbAthlete是一个ComboBox一样。

using CompetitionManager.DataAccess;
using CompetitionManager.ViewModel;
using System.Windows.Controls;

namespace CompetitionManager.View.CompetitionSetup
{
    public partial class AthleteListView : UserControl
    {
        private ViewModelLocator locator = new ViewModelLocator();

        public AthleteListView()
        {
            InitializeComponent();
        }

        private void cbAthlete_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            locator.AthleteList.SelectedAthlete = (Athlete)cbAthlete.SelectedValue;
        }
    }
}

就像我之前说的那样,我在我的程序中的许多地方都这样做并且它工作正常但是在这种情况下有些东西我没有看到这是错的。任何帮助非常感谢。如果我在构造函数中设置selectedAthlete的值,那么它不会设置为null。如果我在构造函数中初始化它,即selectedAthlete = new Athlete();那么它就是同一个故事。

任何和所有帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

如果您发布了XAML会有所帮助,但我猜您忘记根据到目前为止发布的内容设置DataContext。