WPF - Привязка источника элементов TabControl к одному объекту - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть Wpf DatarGrid, который привязан к списку клиентов.Здесь я хочу, чтобы, когда я выбираю одного клиента в сетке данных и нажимал кнопку «Обновить», открывалось окно.Это новое окно имеет вкладку управления.затем второй раз, когда я нажимаю на обновление для другого пользователя в сетке данных, вторая вкладка должна открыться в этом уже открытом новом окне.Для этого я хочу привязать элемент управления Tab только к строке Выбранный клиент, а не к ObservableCollection или списку.Но когда я связываю SelectedCustomer со свойством Itemssource, оно не работает, поскольку заголовок становится пустым.Для заголовка у меня есть Itemtemplate, внутри которого текстовый блок связан со свойством SelectedCustomer, как name.

Какое решение для этого?

Моя сетка данных выглядит следующим образом -

<DataGrid Width="700" Height="500" Margin="20" AutoGenerateColumns="False" IsReadOnly="True" SelectedItem="{Binding SelectedCustomer}" ItemsSource="{Binding Customers}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"></DataGridTextColumn>
                        <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"></DataGridTextColumn>
                        <DataGridTemplateColumn>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Button Margin="5" Click="Update_Clicked">Update</Button>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTemplateColumn>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Button Margin="5">Delete</Button>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>

                    </DataGrid.Columns>
                </DataGrid>

Здесь вы можете видеть, что свойство selecteditem привязано к SelectedCustomer.Теперь окно управления вкладками выглядит так -

 <TabControl Name="UserTabs" ItemsSource="{Binding}">


            <TabControl.ItemTemplate>
                <DataTemplate DataType="TabItem">
                    <TextBlock Text="{Binding FirstName}"></TextBlock>
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <Grid Height="226"  Margin="4">
                        <Grid.Resources>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="Margin" Value="2,2,2,2" />
                                <Setter Property="HorizontalAlignment" Value="Center"></Setter>
                                <Setter Property="FontSize" Value="20"></Setter>
                            </Style>
                        </Grid.Resources>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                        </Grid.RowDefinitions>

                        <TextBlock Grid.Column="0" Grid.Row="0">First Name :</TextBlock>
                        <TextBlock Grid.Column="0" Grid.Row="1">Last Name :</TextBlock>
                        <TextBlock Grid.Column="0" Grid.Row="2">Email Address :</TextBlock>
                        <TextBlock Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" HorizontalAlignment="Left"><Hyperlink>Address :</Hyperlink></TextBlock>
                        <TextBlock Grid.Column="0" Grid.Row="4">City :</TextBlock>
                        <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding FirstName}"></TextBox>
                        <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding LastName}"></TextBox>
                        <TextBox Grid.Column="1" Grid.Row="2" Text="{Binding EmailAddress}"></TextBox>
                        <TextBox Grid.Column="1" Grid.Row="4" Text="{Binding City}"></TextBox>


                        <TextBlock Grid.Column="2" Grid.Row="0">State :</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Center"><Hyperlink>Orders :</Hyperlink></TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="2"></TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="3"></TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="4"></TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="5"></TextBlock>
                        <TextBox Grid.Column="3" Grid.Row="0" Text="{Binding State}"></TextBox>
                        <TextBlock Grid.Column="3" Grid.Row="1"></TextBlock>
                        <TextBlock Grid.Column="3" Grid.Row="2"></TextBlock>
                        <TextBlock Grid.Column="3" Grid.Row="3"></TextBlock>
                        <TextBlock Grid.Column="3" Grid.Row="4"></TextBlock>
                        <TextBlock Grid.Column="3" Grid.Row="5"></TextBlock>

                    </Grid>
                </DataTemplate>
            </TabControl.ContentTemplate>

        </TabControl>   

Как вы можете видеть, я использовал Itemssource = {Binding}, что означает, что Itemssource связан с SelectedCustomer, потому что в коде позади я установил

this.datacontext = SelectedCustomer

А затем в ItemTemplate и Content Template привязали текстовые блоки и текстовые поля к свойствам SelectedCustomer, используя

{Binding <PropertyName>}
...