在WPF中将TabItem转换为UserControl
我的主屏幕上有一个Tab Control。 它有不同的标签项。 例如:
Animals Calfs
等等..
这是标签的设计时预览:
每个选项卡项控件都inheritance自WorkSpaceViewControl (从UserControl派生的抽象类)
正如您所看到的,有一个刷新按钮来刷新控件(重新加载它的数据网格成员)
刷新按钮后面的代码是:
private void buttonRefresh_Click(object sender, RoutedEventArgs e) { //var x = mainTab.SelectedItem as TabItem; //MessageBox.Show(x.Header.ToString());//shows the header //var t = x.Content as TextBlock; //MessageBox.Show(t.Text); var ctrl = mainTab.SelectedItem as TabItem; var myCtrl1 = (WorkSpaceViewControl)ctrl; myCtrl1.Refresh(); }
Refresh()是WorkSpaceViewControl类中的虚方法,并在后续类中重写。
每当我调用该代码时,它都会让我在编译时出错。 我已经尝试了很多种方法:隐式,显式( 你可以在上面的评论代码中看到一些尝试 )。
这是我试图实现的显式转换代码(但失败了):
public static explicit operator WorkSpaceViewControl(TabItem v) { if (v.Content is WorkSpaceViewControl) { return v.Content as WorkSpaceViewControl; } else { throw new InvalidCastException(); } }
通过考虑其他条件,它总是抛出Invalid Cast:
我可以施展它吗? 谢谢你的回答。
UPDATE
抽象类是:
public abstract class WorkSpaceViewControl : UserControl { public WorkSpaceViewControl() { InitializeComponent(); } private void InitializeComponent() { // } #region Inheritance Methods (for sub classes public virtual void GetSelectedEntry() { } public virtual void Refresh() { } public static explicit operator WorkSpaceViewControl(TabItem v) { if (v.Content is WorkSpaceViewControl) { return v.Content as WorkSpaceViewControl; } else { throw new InvalidCastException(); } } #endregion }
你有一个界面:
interface IWorkSpaceViewControl { void GetSelectedEntry(); void Refresh(); bool CanSave { get; } void Save(); }
和userControl:
代码背后:
public partial class DemoUserControl : UserControl, IWorkSpaceViewControl { private bool canSave; public DemoUserControl() { InitializeComponent(); } public void GetSelectedEntry() { // Your implementation } public void Refresh() { // Your Implementation Debug.WriteLine("DemoUserControl Refresh() executed"); } public bool CanSave { get { return canSave; } } private void btnChangeCanSave_Click(object sender, RoutedEventArgs e) { canSave = !canSave; } public void Save() { Debug.WriteLine("DemoUserControl Save() executed"); } }
和一个MainWindow:
Animals
代码背后:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void btnRefresh_Click(object sender, RoutedEventArgs e) { IWorkSpaceViewControl control = tabControl.SelectedContent as IWorkSpaceViewControl; control.Refresh(); } private void SaveCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e) { if (tabControl != null) { e.CanExecute = ((IWorkSpaceViewControl)tabControl.SelectedContent).CanSave; } } private void SaveCommand_Executed(object sender, ExecutedRoutedEventArgs e) { ((IWorkSpaceViewControl)tabControl.SelectedContent).Save(); } }
试试这个
if (v.GetType().BaseType == typeof(WorkSpaceViewControl)) { return v as WorkSpaceViewControl; }