Как программно сгенерировать код XAML?

Мне нужно добавить вкладки, которые содержат Grid. Сетка содержит текстовые поля и метки с уже определенным стилем. Как я могу программно сгенерировать код XAML (вкладки с уже существующими элементами)? Могу ли я это сделать или мне нужно создать каждый элемент, задать ему стиль и добавить в TabItem? Вот часть кода:

<TabItem Header="tabItem1" Name="tabItem1">
                <Grid Name="grid1" HorizontalAlignment="Stretch" VerticalAlignment="Top" DataContext="{Binding ElementName=tabControl1, Path=ActualWidth}" MinWidth="768" MinHeight="446">
                    <Grid.RowDefinitions>
                        <RowDefinition MinHeight="43" Height="*" />
                        <RowDefinition Height="*" MinHeight="45" />
                        <RowDefinition Height="*" MinHeight="435" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" MinWidth="100" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>

                    <TextBox Grid.Column="1" Height="27" Name="textBox1" VerticalAlignment="Top" Margin="11,6,0,0" HorizontalAlignment="Stretch" Width="Auto" FontSize="14" HorizontalContentAlignment="Stretch" MinWidth="141" FlowDirection="LeftToRight" />
                    <Label Content="Supplier" Height="27" Name="label2" VerticalAlignment="Top" FontSize="14" FontFamily="Tahoma" FontWeight="Bold" Margin="21,6,0,0" Width="Auto" IsEnabled="True" HorizontalAlignment="Stretch" Foreground="Black" Background="White" MinWidth="133" HorizontalContentAlignment="Stretch" />
                    <TextBox Grid.Column="1" Grid.Row="1" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,0,0" Name="textBox11" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
                    <Label Grid.Row="1" Content="Supplier Bank" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label3" VerticalAlignment="Top" Width="Auto" Background="White" MinWidth="133" />
                    <TextBox Grid.Column="1" Grid.Row="2" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,0,0" Name="textBox12" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
                    <Label Grid.Row="2" Content="Account Number" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label4" VerticalAlignment="Top" Background="White" MinWidth="133" />
                    <TextBox Grid.Column="4" FontSize="14" Height="27" Margin="11,6,20,0" Name="textBox2" VerticalAlignment="Top" HorizontalAlignment="Stretch" Width="Auto" DataContext="{Binding ElementName=grid1, Path=ActualWidth}" MinWidth="141" />
                    <Label Grid.Column="3" Content="Buyer" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label5" VerticalAlignment="Top" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Background="White" MinWidth="133" />
                    <TextBox Grid.Column="4" Grid.Row="1" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,20,0" Name="textBox3" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
                    <Label Grid.Column="3" Grid.Row="1" Content="Buyer Bank" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label6" VerticalAlignment="Top" Width="Auto" HorizontalAlignment="Stretch" Background="White" MinWidth="133" />
                    <TextBox Grid.Column="4" Grid.Row="2" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,20,0" Name="textBox4" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
                    <Label Grid.Column="3" Grid.Row="2" Content="Account Number" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label7" VerticalAlignment="Top" Width="Auto" HorizontalAlignment="Stretch" Background="White" MinWidth="133" />
                </Grid>
            </TabItem>

person Mrg Gek    schedule 27.07.2015    source источник
comment
Вы пытаетесь программно добавить код xaml с помощью строки?   -  person lem2802    schedule 27.07.2015
comment
DataContext="{Binding ElementName=tabControl1, Path=ActualWidth}"... Что ты здесь пытаешься сделать? Это не имеет никакого смысла :/   -  person almulo    schedule 27.07.2015
comment
Вы не генерируете [код] XAML программно в WPF или что-то в этом роде. Вместо этого вы используете правильный XAML и DataBinding и DataTemplating. Смотрите мой ответ.   -  person Federico Berasategui    schedule 27.07.2015
comment
Спасибо за внимание, Альмуло. Я только начал изучать c# и XAML, могу делать странные вещи)   -  person Mrg Gek    schedule 27.07.2015
comment
@MrgGek Я так и догадался, просто спросил, можем ли мы прояснить любые ваши сомнения относительно того, как работает DataContext :)   -  person almulo    schedule 27.07.2015


Ответы (2)


Привяжите свойство TabControl.ItemsSource к свойству ObservableCollection<SomeViewModel>, а затем используйте DataTemplates, чтобы определить, как будет выглядеть каждая ViewModel.

Подробнее читайте в этом ответе.

person Federico Berasategui    schedule 27.07.2015
comment
Какой шаблон мне следует использовать, если я хочу использовать WPF с базой данных SQL? - person Mrg Gek; 28.07.2015
comment
@MrgGek WPF не имеет ничего общего с базами данных. Это UI-фреймворк. Тем не менее, WPF лучше всего использовать с шаблоном MVVM. - person Federico Berasategui; 28.07.2015
comment
Итак, я не могу передавать данные в базу данных с помощью WPF? Тогда что мне нужно использовать, если я хочу сделать корпоративное приложение, привязанное к базе данных? - person Mrg Gek; 28.07.2015
comment
Корпоративное приложение @MrgGek — это широкий термин. Если вы хотите работать профессионально, вам лучше начать читать о правильно многоуровневой архитектуре, пользовательский интерфейс не несет ответственности за какие-либо действия с базой данных. Для доступа к базе данных Microsoft рекомендует использовать Entity Framework, который, конечно же, является ORM и не имеет ничего общего ни с WPF, ни с какой-либо другой UI Framework. - person Federico Berasategui; 28.07.2015

Вам нужно сделать это программно?

Было бы лучше иметь коллекцию некоторого класса, который мог бы содержать информацию о каждом TabItem, привязать TabControl к этой коллекции и установить ItemTemplate, чтобы каждый элемент отображался одинаково.

Например, у вас может быть такой класс:

public class BankMovement
{
    public string Supplier { get; set; }
    public string SupplierBank { get; set; }
    // ... etc.
}

И в вашей модели представления или коде программной части создайте коллекцию этого типа.

public ObservableCollection<BankMovement> Movements { get; set; }

Movements = new ObservableCollection<BankMovement>();
Movements.Add(new BankMovement());
// add as many movements as you want

//tabControl1.ItemsSource = Movements;  You can do this through Binding in the XAML, preferably

Наконец, в вашем XAML привяжите ItemsSource TabControl к этой коллекции и установите ItemTemplate. Кроме того, в DataTemplate привяжите TextBox к соответствующему свойству класса BankMovement:

<TabControl ItemsSource="{Binding Movements}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <Grid Name="grid1" HorizontalAlignment="Stretch" VerticalAlignment="Top" MinWidth="768" MinHeight="446">
                <Grid.RowDefinitions>
                    <RowDefinition MinHeight="43" Height="*" />
                    <RowDefinition Height="*" MinHeight="45" />
                    <RowDefinition Height="*" MinHeight="435" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" MinWidth="100" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <TextBox Text="{Binding Supplier}" Grid.Column="1" Height="27" Name="textBox1" VerticalAlignment="Top" Margin="11,6,0,0" HorizontalAlignment="Stretch" Width="Auto" FontSize="14" HorizontalContentAlignment="Stretch" MinWidth="141" FlowDirection="LeftToRight" />
                <Label Content="Supplier" Height="27" Name="label2" VerticalAlignment="Top" FontSize="14" FontFamily="Tahoma" FontWeight="Bold" Margin="21,6,0,0" Width="Auto" IsEnabled="True" HorizontalAlignment="Stretch" Foreground="Black" Background="White" MinWidth="133" HorizontalContentAlignment="Stretch" />
                <TextBox Text="{Binding SupplierBank}" Grid.Column="1" Grid.Row="1" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,0,0" Name="textBox11" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
                <Label Grid.Row="1" Content="Supplier Bank" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label3" VerticalAlignment="Top" Width="Auto" Background="White" MinWidth="133" />
                <!-- etc. -->
            </Grid>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>
person almulo    schedule 27.07.2015