在 silverlight 中设置 IsEnabled = false 一个按钮

set IsEnabled = false a button in silverlight

我在 ViewModel class 中有以下代码,在构造函数中我定义启动表单时按钮始终启用 = false ...

 public partial class EditarConceptoWindow : ChildWindow
 {
  public EditarConceptoWindow(string documentoId)
  {
     InitializeComponent();
     viewModel.Saved += new EventHandler<Microsoft.Practices.Prism.Events.DataEventArgs<bool>>(ViewModel_Saved);
    viewModel.Calculation += new EventHandler<Microsoft.Practices.Prism.Events.DataEventArgs<bool>>(ViewModel_Calculation);
    this.DataContext = viewModel;

    BtnCalcular.IsEnabled = false;
    BtnObtenerTCRM.IsEnabled = false;
    ....... rest of code 

在放置选中复选框时选中复选框的事件中,必须启用它才能设置为真,这取决于组合框的特定元素是否也被选中;

   private void cbAgregarManual_Checked(object sender, RoutedEventArgs e)
     {
      if (this.ComboConcepto.SelectedValue.ToString() == "DPI")
        {
            BtnCalcular.IsEnabled = true;
            BtnObtenerTCRM.IsEnabled= true;
        }

    }

当且仅当复选框被选中并在组合框中选择了 DPI 值时,才必须执行此操作。

但是按钮的行为是,当启动表单时,它们总是 IsEnabled = true 并且如果单击复选框控件(如果它有效)但我找不到原因,因为只有在我单击复选框之前它才有效,在 XAML.

中有一些控件(例如 TextBoxes,还有按钮)带有此指令
IsEnabled="{Binding ElementName=cbAgregarManual, Path=IsChecked }"

建议大家把启用的逻辑集中到一个属性,避免这种不匹配的逻辑设置混乱。

在这个新的 属性 中,它将使用 INotifyPropertyChanged 来通知该更改,但从其他属性调用。综上所述,当任何关联值发生变化时,它们都会对逻辑 属性 进行通知调用;该过程确保控件正确 en/dis-abled.


例子

比如这个伪代码,我检查了三个不同的其他属性:

public bool IsEnabledCombo { get { return ClickStatus 
                                       && OtherStatus 
                                       && !string.IsNullOrEmpty( UserText); }

public bool ClickStatus { get { return _clickStatus; } 
                         set { _clickStatus = value; 
                               NotifyPropertyChanged("ClickStatus");
                               NotifyPropertyChanged("IsEnabledCombo");
                             }}

 public bool OtherStatus { get { return _otherStatus; } 
                         set { _clickStatus = value; 
                               NotifyPropertyChanged("OtherStatus");
                               NotifyPropertyChanged("IsEnabledCombo");
                             }}   
  public string UserText { ... 
                          set { _userText = value;                            
                               NotifyPropertyChanged("UserText");
                               NotifyPropertyChanged("IsEnabledCombo");

这样绑定你的控件

  IsEnabled="{Binding IsEnabledCombo }"

因此,只要相关值之一可以更改,它们也会调用 NotifyPropertyChanged("IsEnabledCombo"); 并且控件状态会自动更新。


我在我的博客上提供了另一个类似的通知链接示例:

Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding