我想在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");
首先,它表示的状态下的类