Привязка Silverlight TabControl к сложному объекту с помощью конвертера - PullRequest
1 голос
/ 14 июня 2011

Я пытаюсь привязать свои данные к элементу управления вкладками. У меня заголовки отображаются нормально, но я не уверен, как заставить содержимое вкладок корректно связываться на основе моего шаблона элемента, показанного ниже.

Мне кажется, что я что-то упускаю при создании элемента вкладки, но я не уверен, как связать мой MyCustomObject с каждым из элементов TabItem.

XAML:

<sdk:TabControl ItemsSource="{Binding Singles,Converter={StaticResource TabConverter}}">
            <sdk:TabControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </sdk:TabControl.ItemsPanel>
            <sdk:TabControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBox Text="{Binding Converter={StaticResource RoundNumberConverter}}" Margin="2" />
                        <ListBox x:Name="Matches" ItemsSource="{Binding}" Margin="2">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="200" />
                                            <ColumnDefinition Width="200" />
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition />
                                            <RowDefinition />
                                        </Grid.RowDefinitions>

                                        <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Converter={StaticResource SeedingConverter}, ConverterParameter=true}" Margin="2" />
                                        <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding Converter={StaticResource SeedingConverter}, ConverterParameter=false}" Margin="2" />
                                        <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=Player1Name}" Margin="2" />
                                        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Player2Name}" Margin="2" />

                                    </Grid>


                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </StackPanel>
                </DataTemplate>
            </sdk:TabControl.ItemTemplate>
        </sdk:TabControl>

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

 public class TabConverter : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            IEnumerable<IGrouping<string, MyCustomObject>> source = value as IEnumerable<IGrouping<string, MyCustomObject>>;
            if (source != null)
            {
                var controlTemplate = (ControlTemplate)parameter;

                List<TabItem> result = new List<TabItem>();
                foreach (IGrouping<string, MyCustomObject> tab in source)
                {
                    result.Add(new TabItem()
                    {
                        Header = tab.Key,
                        DataContext = tab //not sure this is right?
                    });
                }
                return result;
            }
            return null;
        }

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

    }

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

У вас большая часть пути, у меня работает следующее:

Удалите ваш DataTemplate и поместите его содержимое прямо в новый UserControl, например, здесь, давайте назовем его MatchesView.

Затем в вашем TabConverter измените содержимое цикла foreach на что-то вроде следующего:

TabItem tabitem = new TabItem();
tabitem.Header = tab.Key;

MatchesView tabview = new MatchesView();
tabview.DataContext = parameter;

tabitem.Content = tabview;
result.Add(tabitem);

Примечание: для этого необходимо передать вашу ViewModel в TabConverter в качестве параметра, например:

<sdk:TabControl SelectedItem="{Binding YourSelectedObject}" ItemsSource="{Binding YourCollectionObject, Converter={StaticResource TabConverter}, ConverterParameter={StaticResource YourViewModel}, Mode=TwoWay}" />

Затем, поскольку у вас есть ViewModel в каждом экземпляре нового элемента управления, настройте привязку соответствующим образом!

Обратите внимание, что хитрость заключается в том, что у вас есть отдельная привязка для отдельного экземпляра выбранного объекта

0 голосов
/ 15 июня 2011

проверка вашей проблемы Я думаю, что нет поддержки для этого.TabItem WPF содержит ItemTemplate & ContentTemplate.Первый шаблон для Заголовок , второй шаблон для "тела".В Silverlight у нас все еще нет ContentTemplate.Официального заявления еще не видели, но этот парень говорит, что оно не будет поддержано до SL5.

...