2013-11-14 93 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"); 

首先,它表示的状态下的类