0

У меня есть DataGrid. И есть шаблон, как подключиться к этому шаблону из кода... Шаблон:

    xmlns:local="clr-namespace:Lab_15"
<Window.Resources>
    <local:TemplateSelector x:Key="templateSelector"/>
    <DataTemplate x:Key="Models">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
            </Grid.RowDefinitions>
            <Label  Grid.Row="0" HorizontalAlignment="Center" Margin="303,0,417,0">Name Table</Label>
            <Label  Grid.Row="0" HorizontalAlignment="Center" Margin="385,0,365,0">Models</Label>
            <DataGrid Name="DataView" AutoGenerateColumns="True" ItemsSource="{Binding}" CanUserAddRows="True" HeadersVisibility="All" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="ModelID"  Binding="{Binding ModelID}"/>
                    <DataGridTextColumn Header="Name Model" Binding="{Binding  NameFurniture}"/>
                    <DataGridTextColumn Header="Description" Binding="{Binding  Description}"/>
                    <DataGridTextColumn Header="Cost" Binding="{Binding  Cost}"/>
                    <DataGridTextColumn Header="SalesID" Binding="{Binding SaleID}"/>
                </DataGrid.Columns>
            </DataGrid>
            <Button Grid.Row="2" Click="Edit_Click" Width="100" Margin="76,0,220,0">Aplly</Button>
            <Button Grid.Row="2" Click="Delet_Click" Width="100" Margin="253,0,43,0">Delet</Button>
        </Grid>
    </DataTemplate>
</Window.Resources>

И куда я его хочу забрасывать:

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0">
            <MenuItem Height="30" Header="Model" Click="Model_Click"></MenuItem>
        </Menu>

<ContentPresenter x:Name="presenter"  Grid.Row="1" Margin="5"  ContentTemplateSelector="{StaticResource templateSelector}"/>
    </Grid>

Я пытаюсь подключиться так(по нажатию на кнопку Model):

 private void Model_Click(object sender, RoutedEventArgs e)
    {
        presenter.Content = "Model";
    }

Создан класс и переписан метод:

 public class TemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;
        if (element != null && item != null && item is string)
        {
            currentItem = item.ToString();
            if (currentItem == "Model")
            {
                return element.FindResource("Models") as DataTemplate;
            }
        }
        return null;
    }
}
Valera
  • 191
  • Почему вы не используете разметку? Ну и в любом случае вам надо установить свойство ItemsSource – Андрей NOP Sep 21 '19 at 16:04
  • @АндрейNOP, при помощи разметки всё не так сложно. Но у меня такая ситуация, имеется один DataGrid, и имеется база данных с 4 таблицами. Я не хочу выставлять 4 DataGrid.. А выводить по желанию пользователя в 1.(т.е. есть 4 соответствующих кнопки). – Valera Sep 21 '19 at 16:23
  • Все равно мотивация не использовать разметку не ясна. Ну и название свойства я вам уже сказал – Андрей NOP Sep 21 '19 at 16:55
  • @АндрейNOP, попытаюсь объяснить. В базе каждая таблица несет разные данные, есть связанные таблицы соотношением 1 к многим, и те данные которые связаны, я хочу выводить в нужном столбце combobox. Может я не правильно понимаю, но если я в разметке опишу столбцы, смогу ли я потом привязывать таблицы там, где combobox не нужны? Не будет ли конфликта? – Valera Sep 21 '19 at 19:54
  • @АндрейNOP, по поводу написаного вами свойства, я знаю что мне нужно именно оно, но как мне до него добраться, я не понимаю.. при создании данной колонки задать атрибут Name и потом по нему подползать? – Valera Sep 21 '19 at 19:56
  • Опишите 4 шаблона разметки и просто подключайте нужный. При создании колонки в коде все как обычно: var column = new DataGridComboBoxColumn(); column.ItemsSource = ...; – Андрей NOP Sep 22 '19 at 03:15
  • @АндрейNOP, 4 шаблона, их просто скрывать так сказать, когда нет необходимости? Это не наложит какие-то проблемы? – Valera Sep 22 '19 at 18:43
  • Не наложит. Не скрывать, а использовать разные шаблоны для разных типов данных с помощью DataTemplate DataType или DataTemplateSelector – Андрей NOP Sep 23 '19 at 07:48
  • @АндрейNOP, имею сейчас проблему, создал шаблон, а как к нему из кода подключиться не могу понять((( блин уже перекопал кучу статей, не нашел... PS отредактировал вопрос.. – Valera Sep 24 '19 at 20:51
  • Вот пример с DataTemplateSelector: https://ru.stackoverflow.com/a/774441/218063 здесь пример с DataTemplate DataType: https://ru.stackoverflow.com/a/765122/218063 – Андрей NOP Sep 25 '19 at 07:21
  • Заведите несколько UserControl с нужными DataGrid, потом просто отображайте нужный в ContentPresenter с помощью одного из указанных мною методов – Андрей NOP Sep 25 '19 at 07:23
  • @АндрейNOP, да я использую ваши советы, но увы.... – Valera Sep 25 '19 at 10:13
  • @АндрейNOP, да я использую ваши советы. Посмотрел внимательней. Созданный шаблон я смог вытянуть, но не подтягивается ItemsSource={Binding cust}. Что я делаю не так? – Valera Sep 25 '19 at 10:28
  • Добавьте в вопрос текущую версию кода – Андрей NOP Sep 25 '19 at 12:24
  • @АндрейNOP, добавил. – Valera Sep 25 '19 at 16:15

0 Answers0