在不同类中设置Button可见性的实现方案咨询
针对你需要在DataGrid加载的类中隐藏5个Button、无法在设计器类操作的场景,提供三种可行方案,按耦合度从高到低排列:
方案1:直接传递Button实例(快速实现)
如果追求简单直接,可将需要控制的Button作为参数传入当前类的方法。以你提供的CostSQL方法为例,修改如下:
修改方法签名
public static void CostSQL(string connstring, string passableQuery, IEdmVault7 vault, int ID, IEdmFolder5 Folder, params Button[] buttonsToHide)
在方法中设置可见性
在try块内合适的位置(比如弹出窗口前/后)添加隐藏逻辑:
// 遍历传入的按钮,设置为不可见 foreach(var btn in buttonsToHide) { if(btn != null) btn.Visible = false; }
调用示例
// 传入需要隐藏的5个Button实例 CostSQL(connStr, query, vault, id, folder, btn1, btn2, btn3, btn4, btn5);
优缺点:实现简单,但当前类与UI控件强耦合,不利于后续代码复用和维护。
方案2:通过委托/事件解耦(推荐)
为降低类之间的耦合,可通过事件通知设计器所属类执行隐藏操作,当前类无需知晓具体控件信息。
在DataGrid所属类中定义事件
// 定义静态事件,用于通知隐藏按钮 public static event Action HideRequiredButtons;
在CostSQL方法中触发事件
在需要隐藏按钮的时机(比如数据加载完成后)触发事件:
// 触发事件,通知订阅方执行隐藏逻辑 HideRequiredButtons?.Invoke();
在设计器所属类中订阅事件
在窗口初始化或DataGrid加载时,订阅该事件:
// 假设DataGrid所属类名为YourDataGridClass YourDataGridClass.HideRequiredButtons += () => { btn1.Visible = false; btn2.Visible = false; btn3.Visible = false; btn4.Visible = false; btn5.Visible = false; };
优缺点:解耦业务类与UI控件,代码更易维护;需注意事件订阅的生命周期,避免内存泄漏。
方案3:MVVM模式(适合复杂WPF场景)
如果是WPF项目,推荐使用MVVM模式,通过数据绑定实现UI状态控制,完全解耦逻辑与界面。
1. 定义ViewModel
public class MainViewModel : INotifyPropertyChanged { private bool _buttonsAreVisible = true; public bool ButtonsAreVisible { get => _buttonsAreVisible; set { _buttonsAreVisible = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. XAML绑定Visibility
在窗口的Resources中添加转换器:
<Window.Resources> <BooleanToVisibilityConverter x:Key="BoolToVis"/> </Window.Resources>
然后给Button绑定属性:
<Button Content="按钮1" Visibility="{Binding ButtonsAreVisible, Converter={StaticResource BoolToVis}}"/> <!-- 其余4个Button重复上述绑定逻辑 -->
3. 在DataGrid所属类中修改ViewModel属性
// 获取窗口的ViewModel实例(假设窗口DataContext已设置为MainViewModel) var viewModel = (MainViewModel)Application.Current.MainWindow.DataContext; // 设置按钮不可见 viewModel.ButtonsAreVisible = false;
优缺点:完全解耦逻辑与UI,适合大型项目;需要搭建MVVM基础结构,有一定学习成本。
你提供的原始代码参考
public static void CostSQL(string connstring, string passableQuery, IEdmVault7 vault, int ID, IEdmFolder5 Folder) { try { SqlConnection con = new SqlConnection(connstring); con.Open(); //concat later to optimize code for universal use by passing variable quote SqlCommand cmd = new SqlCommand(passableQuery, con); DataTable rTbl = new DataTable(); rTbl.Load(cmd.ExecuteReader()); SQLResultSelector RSel = new SQLResultSelector(rTbl, vault, ID, "c", Folder); RSel.ShowDialog(); } catch (Exception ex) { MessageBox.Show("Something happend during your connection to SQL error : " + ex.Message); } }
内容的提问来源于stack exchange,提问作者Angela
相关产品推荐
相关产品推荐

