C# 网格多态的调用刷新事件#

C# 网格多态的调用刷新事件#,c#,wpf,polymorphism,C#,Wpf,Polymorphism,我在WPF中有一个主窗口,它包含: 具有不同选项卡的选项卡控件。每个选项卡中都有一个不同的控件,并包含一个数据网格 一个框架控件-它也有不同的控件分别用于数据输入 刷新按钮(尚未实现) 我已经成功地实现了用于数据输入的选项卡控件和框架,但问题是在切换选项卡之前无法刷新选项卡控件。我想在主窗口上有一个中央刷新按钮(我前面提到的那个)。 谁能指导我怎么做 由于tab的当前对象类型将仅在运行时确定,因此它是多态性吗?您可以为所有用户控件使用一个界面: public interface IRefresh

我在WPF中有一个主窗口,它包含:

  • 具有不同选项卡的选项卡控件。每个选项卡中都有一个不同的控件,并包含一个数据网格
  • 一个框架控件-它也有不同的控件分别用于数据输入
  • 刷新按钮(尚未实现)
  • 我已经成功地实现了用于数据输入的选项卡控件和框架,但问题是在切换选项卡之前无法刷新选项卡控件。我想在主窗口上有一个中央刷新按钮(我前面提到的那个)。 谁能指导我怎么做


    由于tab的当前对象类型将仅在运行时确定,因此它是多态性吗?

    您可以为所有用户控件使用一个界面:

    public interface IRefreshAble
    {
        void Refresh();
    }
    
    public interface ICanDeleteItem
    {
        void Delete(/*parameters omitted*/);
        bool CanDelete { get; }
    
    }
    
    public interface IHoldATypedItem ///sorry for bad name
    {
        Type TheType { get; }
    }
    
    public class TheUserControl : UserControl, IRefreshAble, ICanDeleteItem, IHoldATypedItem 
    {
         public void Refresh()
         {
             //Your refreshcode
         }
    
         public bool CanDelete {get { /*code that indicates if an item can be deleted*/ } }
    
    
         public void Delete(/*parameters ommited*/)
         {
              if(CanDelete)
              {
                 //Delete Item
              }
         }
    
         public Type TheType { get { return typeOf(Employee); } }
         // otherstuff
    }
    
    然后通过usercontrols实现此接口:

    public interface IRefreshAble
    {
        void Refresh();
    }
    
    public interface ICanDeleteItem
    {
        void Delete(/*parameters omitted*/);
        bool CanDelete { get; }
    
    }
    
    public interface IHoldATypedItem ///sorry for bad name
    {
        Type TheType { get; }
    }
    
    public class TheUserControl : UserControl, IRefreshAble, ICanDeleteItem, IHoldATypedItem 
    {
         public void Refresh()
         {
             //Your refreshcode
         }
    
         public bool CanDelete {get { /*code that indicates if an item can be deleted*/ } }
    
    
         public void Delete(/*parameters ommited*/)
         {
              if(CanDelete)
              {
                 //Delete Item
              }
         }
    
         public Type TheType { get { return typeOf(Employee); } }
         // otherstuff
    }
    
    现在,您可以将所有用户控件(例如)放在一个列表中,并执行以下操作:

    foreach(IRefreshAble item in theList)
    {
        item.Refresh();
    }
    

    如果所有用户控件都有不止一个通用的Refresh()方法,那么只需扩展此成员的接口,就可以获得所需的多态性。

    非常好的方法。但是,如果我们必须只为某个控件执行功能,该怎么办呢。像Update()或Delete()方法吗?您可以在UserControl上拥有所需的任意多个接口。。。也许是一个界面,一个项目。你可以检查一个控件是否实现了一个带有“control is ICanDeleteAnItem”的接口,就像你可以查找基类一样。我会使用commandbindings,并在CanExecute eventhandler中使用此检查。如果我不能正确地传达它,请原谅。我有几个控件(UserControl),它们都需要Update()、Delete()和Update()方法。虽然我们可以在整个列表中使用Update(),但Delete()和Update()需要以多态方式知道调用方对象的类型(如果错误,请更正我),以便由精确的UserControl调用。如果需要,还可以使用type属性创建一个接口。。。或者扩展具有该属性的接口