我想在WPF中實現工具箱控件。 (正如你可以在圖片中看到的那種mspaint工具箱) 點擊其中一個按鈕可以影響其他按鈕的狀態,但不會影響其他按鈕的狀態。我試圖用不同的顏色來表達我的觀點。 如果您單擊第一個紅色按鈕而不是另一個紅色按鈕,則它們都會被點擊鼠標。 但如果你點擊另一個按鈕,它將變成紅色按鈕狀態。.Net中的工具箱設計
所以我的問題是關於架構,是否有一個很好的已知設計來管理按鈕的狀態,支持其中的不同組?
我想在WPF中實現工具箱控件。 (正如你可以在圖片中看到的那種mspaint工具箱) 點擊其中一個按鈕可以影響其他按鈕的狀態,但不會影響其他按鈕的狀態。我試圖用不同的顏色來表達我的觀點。 如果您單擊第一個紅色按鈕而不是另一個紅色按鈕,則它們都會被點擊鼠標。 但如果你點擊另一個按鈕,它將變成紅色按鈕狀態。.Net中的工具箱設計
所以我的問題是關於架構,是否有一個很好的已知設計來管理按鈕的狀態,支持其中的不同組?
我認爲你會從 「觀察者模式」 中受益。 http://en.wikipedia.org/wiki/Observer_pattern
主題將是工具箱,觀察者將是工具箱中的按鈕。它使得管理按鈕的狀態變得非常簡單 - 我用它來達到類似的目的。
你可以有一個代表狀態的類(可以寫得比這裏好得多)。並使用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");
首先,它表示的狀態下的類