【问题标题】:How to bind to the close event of the Infragistics WPF TabItemEx?如何绑定到 Infragistics WPF TabItemEx 的关闭事件?
【发布时间】:2013-02-22 11:11:30
【问题描述】:

我正在通过 MVVM 方式开发 WPF 项目。

我将 Observable Collection 绑定到 XamTabControl。如果我向 Observable Collection 添加一个新项目,则会生成一个新选项卡。但是如果我关闭选项卡,选项卡项不会从 Observable 集合中删除。

如果我可以触发选项卡的关闭事件(或关闭事件),我可以手动执行此操作。但是这两个事件没有被触发。但是某些事件会被触发,例如 MouseUp。

<igWindows:XamTabControl 
 Height="198" 
 HorizontalAlignment="Left" 
 Margin="0,54,0,0" 
 ItemsSource="{Binding Tabs}"
 SelectedItem="{Binding SelectedTab}"
 Name="xamTabControl1" 
 VerticalAlignment="Top" 
 Width="651">

     <i:Interaction.Triggers>
           <i:EventTrigger EventName="Closing">
                <i:InvokeCommandAction Command="{Binding TabCloseCommand}" />
           </i:EventTrigger>
      </i:Interaction.Triggers>

     <igWindows:XamTabControl.ItemContainerStyle>
           <Style TargetType="igWindows:TabItemEx">
                <Setter Property="Header" Value="{Binding Header}"/>
                <Setter Property="CloseButtonVisibility" Value="{Binding CloseButtonVisibility}"/>
           </Style>
      </igWindows:XamTabControl.ItemContainerStyle>

     <igWindows:XamTabControl.ContentTemplate>
          <!-- this is the body of the TabItem template-->
          <DataTemplate>
                <TextBlock Text="{Binding Content}" />
          </DataTemplate>
      </igWindows:XamTabControl.ContentTemplate>

 </igWindows:XamTabControl>

这是我的视图模型

private ObservableCollection<TabItem> tabs;
private TabItem selectedTab;
private ICommand tabCloseCommand;

public ObservableCollection<TabItem> Tabs
{
     get
     {
         return tabs;
     }
     set
     {
          tabs = value;
          NotifyPropertyChanged("Tabs");
     }
}



public TabItem SelectedTab
{
     get
     {
          return selectedTab;
     }
     set
     {
          selectedTab = value;
          NotifyPropertyChanged("SelectedTab");
     }
}



public ICommand TabCloseCommand
{
     get
     {
          if (tabCloseCommand == null)
          {
          tabCloseCommand = new RelayCommand(param => this.CloseTab(), null);
          }
          return tabCloseCommand;
      }
}



private void CloseTab()
{

}

【问题讨论】:

    标签: wpf mvvm tabs command infragistics


    【解决方案1】:

    这可能是因为运行 Closing 事件的对象的 DataContext 是您的 TabItem 类,而不是包含 TabCloseCommand 的类

    首先使用ElementNameRelativeSource 将您的命令绑定的Source 设置为TabControl.DataContext,它应该可以工作

    <i:InvokeCommandAction Command="{Binding ElementName=xamTabControl1, 
                                             Path=DataContext.TabCloseCommand}" />
    

    【讨论】:

      【解决方案2】:

      您必须连接关闭事件的代码不起作用,因为 XamTabControl 上没有 Closing 或 Closed 事件,这是关联的对象。我不确定是否可以使用 EventTrigger 从 xamTabControl 附加到 TabItemEx 的事件。如果要在没有 EventTrigger 的情况下将处理程序添加到 XamTabControl,您将执行以下操作:

      <igWindows:XamTabControl 
          Name="xamTabControl1" 
          AllowTabClosing="True" 
          igWindows:TabItemEx.Closed="OnTabClosed">
      
      </igWindows:XamTabControl>
      

      您还可以在帮助中的Removing a Closed Tab 主题中查看详细示例。

      【讨论】:

      • 是的。我已将命令绑定到 tabcontrol 而不是 tabitem。所以我更新了代码,但没有用。 &lt;i:Interaction.Triggers&gt; &lt;i:EventTrigger EventName="igWindows:TabItemEx.Closing"&gt; &lt;i:InvokeCommandAction Command="{Binding CloseTabCommand}" /&gt; &lt;/i:EventTrigger&gt; &lt;/i:Interaction.Triggers&gt;
      • 我在回答之前已经对此进行了测试,但如果我按照我在答案中显示的方式添加事件,它就不起作用了。我不确定使用 EventTrigger 执行此操作的正确方法是什么,或者当 EventTrigger 附加到 XamTabControl 时是否可以侦听 TabItemEx 上的事件。
      猜你喜欢
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多