none
WPF MVVM отобразить число элементов ICollectionView в TabItem RRS feed

  • Общие обсуждения

  • Здравствуйте! Использую WPF MVVM.

    На форме есть TabControl c несколькими табами. В табах располагаются DataGrid, каждая из которых привязана к своей ICollectionView.


    <TabControl x:Name="tabControl" Style="{StaticResource TabControlStyle1}" > <TabItem Header="Tab1" Style="{StaticResource TabItemStyle1}"> <Grid> <usercontrol:CustomDataGrid ItemSource="{Binding SomeView1}"/> </Grid> </TabItem> <TabItem Header=" Tab2" Style="{StaticResource TabItemStyle1}"> <Grid> <usercontrol:CustomDataGrid ItemSource="{Binding SomeView2}"/> </Grid> </TabItem> </TabControl>

     Код ViewModel:

    public ICollectionView SomeView1
            {
                get
                {
                    return _someView1;
                }
                set
                {
                    _someView1= value;
                    NotifyPropertyChanged();
                }
            }
    
    SomeView1 = new CollectionViewSource
                    {
                        Source = MyObservableCollection1
                    }.View;

    Аналогично для SomeView2.

    Стиль вкладки такой:

    <Style x:Key="TabItemStyle1" TargetType="{x:Type TabItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <ControlTemplate.Resources>
                            <converter:TabItemSelectionConverter x:Key="WidthConverter" />
                        </ControlTemplate.Resources>
                        <Grid>
                            <Border x:Name="border" Height="Auto"  Background="Transparent" BorderThickness="0,0,0,1" BorderBrush="Transparent" Margin="10,0,10,0">
                                <!—Содержимое таба -->
                                <StackPanel Orientation="Horizontal">
                                    <ContentPresenter x:Name="content" ContentSource="Header" HorizontalAlignment="Center" TextBlock.Foreground="#FF919596" TextBlock.FontSize="18" TextBlock.FontWeight="Thin"/>
                                    <TextBlock Width="Auto" Text="{Binding TextFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                                </StackPanel>
                                
                            </Border>
                        </Grid>
                        <ControlTemplate.Triggers>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    На данный момент рядом с ContentPresenter расположил TextBlock, который привязан к свойству TextFilter из ViewModel. Т.е. есть строка поиска, в которую я ввожу текст и он отображается рядом с заголовком таба.

    Выглядит так для каждого таба, т.е. этот текст появляется у каждого таба:

    

    Я так понимаю, что вместо дополнительного текста в стиле мне нужно сделать как здесь stackoverflow:

     <TabItem.Header>
            <StackPanel Style="{StaticResource TabHeaderPanel}">
                <Image Source="/WpfTutorialSamples;component/Images/bullet_blue.png" />
                <TextBlock Text="Blue" Foreground="Blue" />
            </StackPanel>
        </TabItem.Header>
    Но как привязаться из XAML к свойству Count/Lenght ICollectionView/Collection? Можно, конечно, сделать свойства INotifyPropertyChanged, содержащие число элементов коллекций, но это какой то простецкий выход ))

    Также в статье на SO (ссылка выше) упоминалось про повторное использование кода и DataTemplate. Допустим у меня в шаблоне будет картинка, текст и текст-счетчик элементов коллекции. Можно ли при использовании этого подхода решить мою задачу? Хочется расти в сложности применяемой реализации :)

    Спасибо!





    22 октября 2017 г. 19:41

Все ответы