2013-11-14 170 views
0

我想在WPF中實現工具箱控件。 (正如你可以在圖片中看到的那種mspaint工具箱) 點擊其中一個按鈕可以影響其他按鈕的狀態,但不會影響其他按鈕的狀態。我試圖用不同的顏色來表達我的觀點。 如果您單擊第一個紅色按鈕而不是另一個紅色按鈕,則它們都會被點擊鼠標。 但如果你點擊另一個按鈕,它將變成紅色按鈕狀態。.Net中的工具箱設計

所以我的問題是關於架構,是否有一個很好的已知設計來管理按鈕的狀態,支持其中的不同組?

enter image description here

回答

0

我認爲你會從 「觀察者模式」 中受益。 http://en.wikipedia.org/wiki/Observer_pattern

主題將是工具箱,觀察者將是工具箱中的按鈕。它使得管理按鈕的狀態變得非常簡單 - 我用它來達到類似的目的。

0

你可以有一個代表狀態的類(可以寫得比這裏好得多)。並使用INotifyPropertyChanged和Binding來控制按鈕的狀態。我並不完全相信這是一種「偉大」的做法。但這是一種方式(我認爲它可能與另一個答案中提到的觀察者模式有一點相關)。

public class ControlState : INotifyPropertyChanged 
{ 
    private bool _redOneChecked; 
    public bool RedOneChecked { 
    get { return _redOneChecked; } 
    set 
    { 
     OnPropertyChanged("RedOneChecked"); 
     _redOneChecked = value; 
     RedTwoChecked = RedOneChecked; 
     GreenOneChecked = !RedTwoChecked; 
    } 
    } 

    private bool _redTwoChecked; 
    public bool RedTwoChecked 
    { 
    get { return _redTwoChecked; } 
    set 
    { 
     OnPropertyChanged("RedTwoChecked"); 
     _redTwoChecked = value; 
     RedOneChecked = RedTwoChecked; 
     GreenOneChecked = !RedTwoChecked; 
    } 
    } 

    private bool _greenOneChecked; 
    public bool GreenOneChecked 
    { 
    get { return _greenOneChecked; } 
    set 
    { 
     OnPropertyChanged("GreenOneChecked"); 
     _greenOneChecked = value; 
     RedOneChecked = !GreenOneChecked; 
     RedTwoChecked = !GreenOneChecked; 
    } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

然後數據綁定的UI控件:

var state = new ControlState(); 
controlRedOne.DataBindings.Add("Checked", state, "RedOneChecked"); 

首先,它表示的狀態下的類