2015-09-06 3 views
0

У меня есть TabControlограничительные элементы управления вкладки в одном свойстве ObservableCollection, с закруткой

Я последовал ответ, выбранный here к письму. Дело в том, что в моем случае ExistingTabs не является ObservableCollection, но свойство из ObservableCollection:

Public Class TestData : INotifyPropertyChanged // and the required event handler is there also, not shown here 
{ 
    public TabItem tiTestTab {get; set;} 
    // another dozen properties 
} 

и

public class ReportData 
{ 
    public static ObservableCollection<TestData> testData {get;set;} 
    // another dozen properties 
} 

Вот что я сделал:

<Window.Resources> 
    <CollectionViewSource x:Key="ExistingTabs" Source="{Binding Path=(local:ReportDataSet.testData), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
</Window.Resources> 
<TabControl> 
    <TabControl.ItemsSource> 
     <CompositeCollection> 
      <TabItem>SomeSpecialItem</TabItem> 
      <CollectionContainer Collection="{Binding Source={StaticResource ExistingTabs}}"/> 
     </CompositeCollection> 
    </TabControl.ItemsSource> 
</TabControl> 

Это, конечно, помещает testData в вкладки, а не в свойство tiTestTab.

Я в затруднении.

Предпочтительно, только XAML. Использование C# и Visual Studio 2013.

Спасибо.

+0

Вы хотите, чтобы привязка TwoWay для сбора, или это достаточно, чтобы привязать OneWay? – VMaleev

+0

@VMaleev: oneway достаточно. Элемент управления вкладкой не имеет функции «удалить», и все изменения происходят из наблюдаемого набора в пользовательский интерфейс. – zazkapulsk

+0

Еще один: вам действительно нужно, чтобы testData была статичной? – VMaleev

ответ

1

Xaml код:

<Window.Resources> 
    <local:CollectionConverter x:Key="collectionConverter" /> 
    <CollectionViewSource x:Key="ExistingTabs" Source="{Binding Path=(local:ReportDataSet.testData), Converter={StaticResource collectionConverter}, UpdateSourceTrigger=PropertyChanged}"/> 
</Window.Resources> 
<TabControl> 
    <TabControl.ItemsSource> 
     <CompositeCollection> 
      <TabItem Header="test"> 
       <StackPanel> 
        <Button Content="Add new item" Click="AddNewTabItem"></Button> 
        <Button Content="Remove last item" Click="RemoveLastItem"></Button> 
       </StackPanel> 
      </TabItem> 
      <CollectionContainer Collection="{Binding Source={StaticResource ExistingTabs}}" > 
      </CollectionContainer> 
     </CompositeCollection> 
    </TabControl.ItemsSource> 
</TabControl> 

Преобразователь:

public class CollectionConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is ObservableCollection<TestData>) 
     { 
      return new ObservableCollection<TabItem>(((ObservableCollection<TestData>)value). 
       Select(q => q.tiTestTab)); 
     } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

ReportDataSet:

public class ReportDataSet 
{ 
    public static ObservableCollection<TestData> testData { get; set; } 

    static ReportDataSet() 
    { 
     testData = new ObservableCollection<TestData>(); 
     testData.Add(new TestData() 
     { 
      tiTestTab = new TabItem() 
      { 
       Header = "test 1" 
      } 
     }); 

     testData.CollectionChanged += (s, e) => { OnStaticPropertyChanged("testData"); }; 
    } 
    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; 

    protected static void OnStaticPropertyChanged(string propertyName) 
    { 
     var handler = StaticPropertyChanged; 
     if (handler != null) handler(null, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Code-за (для целей тестирования):

private void AddNewTabItem(object sender, RoutedEventArgs e) 
    { 
     ReportDataSet.testData.Add(new TestData() 
     { 
      tiTestTab = new TabItem() 
      { 
       Header = "test " + (ReportDataSet.testData.Count + 1) 
      } 
     }); 
    } 

    private void RemoveLastItem(object sender, RoutedEventArgs e) 
    { 
     if (ReportDataSet.testData.Count == 0) return; 

     ReportDataSet.testData.Remove(ReportDataSet.testData.Last()); 
    } 

Надеюсь, это поможет

+0

Привет .. Он говорит: «Имя CollectionConverter не существует в пространстве имен .....» – zazkapulsk

+0

Вы добавили его, добавили «локальное» пространство имен и восстановленный проект? =) – VMaleev

+0

Действительно. Странный. Конечно, здесь уже были «местные». – zazkapulsk