【问题标题】:Silverlight : Bind SelectedItem of DataGrid to Customized TabControlSilverlight:将 DataGrid 的 SelectedItem 绑定到自定义的 TabControl
【发布时间】:2014-03-18 09:52:39
【问题描述】:

你好我有一个如下的dataGrid

<sdk:DataGrid IsReadOnly="True" 
          ItemsSource="{Binding NodeCollection}"
          SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
          SelectionMode="Single"
          AutoGenerateColumns="False">

以前我有另一个 DataGrid,它填充了来自上述数据网格的 SelectedItem 的内容。现在我不得不介绍一个可以动态添加新标签的自定义标签控件。选项卡项目现在必须显示 SelectedItem 的内容。我有一个按钮(添加新),它向选项卡控件添加一个新的选项卡项(复制前一个选项卡项)。

<Button Content="Add New" Command="{Binding AddNewTemplateCommand}"/>

<templateTabs:BindableTabControl MyItemsSource="{Binding ModalityTemplates}">
<templateTabs:BindableTabControl.TabItemTemplate>
                <DataTemplate>
                       <tabView:ModalityTemplateView/>
                </DataTemplate>
<templateTabs:BindableTabControl.TabHeaderItemTemplate>
               <DataTemplate>
                     <StackPanel Orientation="Horizontal" Margin="2,2,2,2">
                     <TextBlock Text="{Binding Header, Mode=TwoWay}" />
                    <Button Height="16" Width="16" Margin="5,0,0,0" Padding="0" Command="{Binding DeleteTemplateCommand}" Content ="X" />
                    </StackPanel>
               </DataTemplate>
</templateTabs:BindableTabControl.TabHeaderItemTemplate>
</templateTabs:BindableTabControl>

目前我需要从 dataGrid 中选择项目并单击添加新按钮以显示第一个默认选项卡项目。但是,我希望在选择 dataGrid 中的项目后立即显示第一个选项卡项目。

寻找一个简单的解决方法。

【问题讨论】:

    标签: c# wpf silverlight datagrid tabcontrol


    【解决方案1】:

    由于BindableTabControl 是您的代码,您可以轻松地向其中添加DependencyProperty 作为第一个(也是唯一一个)项目的可绑定源:

    <sdk:DataGrid x:Name="NodeSelector" ... />
    <templateTabs:BindableTabControl
        SingletonItem="{Binding Path=SelectedItem, ElementName=NodeSelector}"
        MyItemsSource="{Binding Path=ModalityTemplates}">
        ...
    </templateTabs:BindableTabControl>
    

    您的选项卡控件需要对这个新属性的任何更改做出反应:

    public object SingletonItem
    {
        get { return (object) GetValue(SingletonItemProperty); }
        set { SetValue(SingletonItemProperty, value); }
    }
    
    public static readonly DependencyProperty SingletonItemProperty =
            DependencyProperty.Register("SingletonItem", typeof (object), typeof (BindableTabControl),
            new PropertyMetadata(OnSingletonItemChanged));
    
    public static void OnSingletonItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((BindableTabControl) d).UpdateItems();
    }
    
    private void UpdateItems()
    {
        //it is up to you to implement this method, so this is only a sketch
        //the null check for SingletonItem is missing too
        if (IsNullOrEmpty(MyItemsSource))
        {
            Items = Enumerable.FromSingleItem(SingletonItem);
        } else {
            Items = MyItemsSource;
        }
    }
    ...
    public static void OnMyItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if ( e.OldValue != null ) { RemoveItemsChangedEventHandlers( e.OldValue as INotifyCollectionChanged ); }
        if ( MyItemsSource != null ) { AddItemsChangedEventHandlers( MyItemsSource as INotifyCollectionChanged ); }
        ((BindableTabControl) d).UpdateItems();
    }
    
    private void MyItemsSourceItemsChanged(...)
    {
        ((BindableTabControl) d).UpdateItems();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 2014-10-10
      • 2014-06-17
      • 2011-04-07
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多