2011-10-12 64 views
2

我有這個ToggleButton在我的WP7的應用程序,我綁定到我的視圖模型的屬性。我也有一個ToggleButton的命令,單擊按鈕時它可以工作。綁定的切換按鈕的財產器isChecked在WP7

基於該命令的結果,我設置綁定到ToggleButton.IsChecked屬性的屬性。但是無論我設置屬性如何,切換按鈕都會保持自己的生活,只需在未選中狀態和已選中狀態之間進行切換。這是預期的行爲還是這是一個錯誤?

好像切換按鈕失去了它的約束力上點擊時,這會是真的嗎?我想要綁定的原因是我並不總是希望更改已選狀態,因爲我的命令中的邏輯可能會失敗,例如網絡關閉了,所以它不能在後臺設置我想要的,等等。

任何辦法解決這個問題呢?

的XAML:

​​

的樣式設置基於狀態的按鈕的圖像。的命令執行邏輯被點擊時按鈕和,正如前面所說的,套IsToggleButtonChecked到所需的值。我在IsChecked上都試過OneWay和TwoWay,但是我看不出有什麼不同。

視圖模型:

public const string IsToggleButtonCheckedPropertyName = "IsToggleButtonChecked"; 

    private bool _isToggleButtonChecked; 

    public bool IsToggleButtonChecked 
    { 
     get { return _isToggleButtonChecked; } 

     set 
     { 
      if (_isToggleButtonChecked == value) 
      { 
       return; 
      } 

      _isToggleButtonChecked = value; 

      RaisePropertyChanged(IsToggleButtonCheckedPropertyName); 
     } 
    } 

這個屬性我想改變的切換按鈕的選中狀態,每次設定。

+0

您可以分享您用於切換按鈕的XAML嗎?也是你綁定的財產的代碼? – apiguy

+0

如果您使用mvvm-light作爲視圖模型,建議使用EventToCommand(http://geekswithblogs.net/lbugnion/archive/2009/11/05/mvvm-light-toolkit-v3-alpha-2-eventtocommand -behavior.aspx) –

回答

0

對於其他人可能會質疑一樣:我使用的雙向模式爲執政官說解決了這一點,但讓它通過自身的正常情況下更改其值。我希望它保持與之前相同的狀態,我點擊它,我只是將可綁定值設置爲想要的值。另外,我還有一個跟蹤未綁定的isChecked狀態的變量。通過這樣做,我可以檢查並設置相應的值,並且不要弄亂視覺檢查狀態。這有效,但它不是一個完美的方式來做到這一點。

1

確保ToggleButton被通知您對綁定屬性的任何變化。

XAML

<ToggleButton Click="OnClicked" 
       IsChecked="{Binding IsChecked, Mode=TwoWay}" /> 

C#

private bool _isChecked = false; 
public bool IsChecked 
{ 
    get { return _isChecked; } 
    set 
    { 
    if(value != _isChecked) { 
     _isChecked = value; 
     NotifyPropertyChanged("IsChecked"); 
    } 
    } 
} 

讓你的邏輯在代碼中設置IsChecked = false;後面取消按鈕。

+0

你的意思是必須設置:MyToggleButton.IsChecked = false每次我點擊它,即在你創建的OnClicked事件? – kgrevehagen

+0

@kgrevehagen不,您不需要在使用綁定時通過名稱引用ToggleButton。只需設置綁定屬性的值。所以,點擊按鈕後,不管你在Clicked處理程序中做了什麼,如果失敗了,將綁定屬性設置爲false。 – Praetorian

+0

是的,這就是我所做的,我設置Isckecked = false,如果我想要它取消選中,並且IsChecked = true,如果我想檢查它。但我的問題是,在點擊一下後,它不會聽到綁定。當你說代碼後面,你的意思是xaml.cs或ViewModel?因爲IsChecked位於ViewModel中。那麼,如何在點擊後保持綁定? – kgrevehagen

0

沒有看到任何代碼,我的第一個直覺就是驗證ViewModel實現INotifyPropertyChanged,並且綁定到IsEnabled的屬性的setter在設置時觸發屬性changed事件。

using System.ComponentModel; 

class MyViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private bool _enableCheckBox; 
    public bool EnableCheckBox 
    { 
     get { return _enableCheckBox } 
     set 
     { 
      _enableCheckBox = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("EnableCheckBox")); 
     } 
    } 
}