即使发射

时间:2015-08-21 10:59:57

标签: wpf mvvm caliburn.micro

尝试使用caliburn实现简单验证。我想要的是根据特定条件启用/禁用保存按钮。 视图:

`<xctk:MaskedTextBox x:Name="pm_personId" cal:Message.Attach="[Event  LostFocus] = [Action CanSave()]" Mask="00-000-000?"/>
<Button Content="Save" x:Name="Save" />`

型号:

 public class PersonModel
    {        
        public String personId { get; set; }        

        public PersonModel() {}
        public PersonModel(String id)
        {
            this.id = personId;
        }
    }

视图模型:

[ImplementPropertyChanged]
    public class PersonViewModel : Screen
    {
        public PersonModel pm { get; set; }

        public PersonViewModel()
        {
            pm = new PersonModel();
        }

        public bool CanSave()
        {
            MessageBox.Show(pm.personId);
            if (pm.personId != null)
                return true;
            else return false;
        }   

    }

使用正确的值触发MessageBox但未启用按钮。我错过了什么。要么是错过了使用caliburn的东西,要么就是做了太多的魔术。我开始怀疑它最初可能会节省你的时间会在调试中丢失,只是我的外表。

2 个答案:

答案 0 :(得分:1)

谢谢@CCamilo,但你的答案不完整。对于遇到类似问题的其他人,下面是我的最终工作代码:

[ImplementPropertyChanged]
public class PersonModel
    {        
        public String personId { get; set; }        
        public event PropertyChangedEventHandler PropertyChanged;
        public PersonModel() {}
        public PersonModel(String id)
        {
            this.id = personId;
        }
    }

[ImplementPropertyChanged]
    public class PersonViewModel : Screen
    {
        public PersonModel pm { get; set; }

        public PersonViewModel()
        {
            pm = new PersonModel();
            this.pm.PropertyChanged += pm_PropertyChanged;
        }
        void pm_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            NotifyOfPropertyChange(() => CanSave);
        }
        public bool CanSave
        {
            get { return pm.personId != null; }           
        }   
    }

答案 1 :(得分:0)

你遇到的错误是CanSave()方法..它应该是一个属性:

public bool CanSave
{
    get
    {
        if (pm.personId != null)
            return true;
        else return false;
    }
}