2015-02-23 36 views
3

我有以下視圖模型NotifyPropertyChanged上依賴特性

[NotifyPropertyChanged] 
public class ActivateViewModel 
{ 
    public string Password { get; set; } 
    public bool ActivateButtonEnabled { get { return !string.IsNullOrEmpty(Password); } } 
    ... 
} 

在我看來,我想啓用/禁用取決於密碼的文本框是否具有價值或者不是一個按鈕。

ActivateButtonEnabledPassword屬性更改時未自動通知。我究竟做錯了什麼?我正在閱讀this article,如果我理解正確,PostSharp應該能夠自動處理相關屬性。

+1

這應該與PS開箱即用。請,你可以在這裏發佈你的xaml嗎?你使用什麼類型的項目(WPF,Silverlight,WP等)? – 2015-02-27 11:51:34

回答

0

我認爲你需要訪問密碼爲'this.Password',因爲PostSharp期望在所有依賴屬性之前使用'this'訪問器。

+0

不幸的是,沒有奏效。 – 2015-02-24 00:33:56

0

請考慮使用ICommand接口。該接口包含ICommand.CanExecute Method,用於確定命令是否可以在當前狀態下執行。 ICommand接口的一個實例可以綁定到Button實例的Command屬性。如果命令無法執行,該按鈕將被自動禁用。

的具有RaiseCanExecuteChanged()樣方法ICommand接口的實現必須被用來實現所描述的行爲,例如:從棱鏡庫

  • DelegateCommand類。
  • RelayCommand來自MVVM Light庫。

ViewModel使用DelegateCommand類從棱鏡庫的實現:

[NotifyPropertyChanged] 
public class ActivateViewModel 
{ 
    private readonly DelegateCommand activateCommand; 
    private string password; 

    public ActivateViewModel() 
    { 
     activateCommand = new DelegateCommand(Activate,() => !string.IsNullOrEmpty(Password)); 
    } 

    public string Password 
    { 
     get { return password; } 
     set 
     { 
      password = value; 
      activateCommand.RaiseCanExecuteChanged(); // To re-evaluate CanExecute. 
     } 
    } 

    public ICommand ActivateCommand 
    { 
     get { return activateCommand; } 
    } 

    private void Activate() 
    { 
     // ... 
    } 
} 

XAML代碼:

<Button Content="Activate" 
     Command="{Binding ActivateCommand}" /> 

沒有找到關於PostSharp的ICommand接口向文檔支持,但一個問題:INotifyPropertyChanged working with ICommand?, PostSharp Support

+0

我很欣賞這種努力,但似乎很愚蠢地拉入棱鏡,走出我的方式去尋找那些應該可以用我目前已有的工具開箱即用的東西。 – 2015-02-24 16:01:20

+0

@TheMuffinMan,當然,棱鏡庫僅用於例子。可以使用另一個合適的'ICommand'接口實現(其他庫)或在當前解決方案(項目)中創建。答案已更新。 – 2015-02-24 18:22:09

0

在視圖中,您使用的是什麼控件?密碼箱?可能的是,財產密碼永遠不會更新。

出於安全原因,Passwordbox.Password不是依賴項屬性,而是不支持綁定。你有一個解釋,並在可能的解決方案:

http://www.wpftutorial.net/PasswordBox.html

如果控制不是passwordbox,你可以寫我們的看法?

+0

我正在使用passwordchanged事件的事件處理程序,然後在處理程序中手動設置'Password',但我也嘗試使用常規文本框而沒有更改的處理程序,它仍然不起作用。 – 2015-02-24 15:54:44

+0

視圖很簡單。 'Textbox text =「{Binding Path = Password}」''Button IsEnabled =「{Binding Path = ActivateEnabled}」' – 2015-02-24 16:04:17