在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; }