Привязка XAML / WPF к Page.Resources - Как выполняется привязка? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь использовать 2 DataTemplates, чтобы создать что-то вроде этого ниже:

Horizontally wrapping chips/recipient names

Мне нужен элемент управления, который позволит для моего динамически созданного имени -Tag (количество фишек в Material Design в XAML), чтобы заполнить синюю область в квадрате, располагая сначала горизонтально, а затем вертикально по мере заполнения каждого ряда. Насколько я понимаю, WrapPanel - это то, что мне нужно использовать, я нашел различные примеры и попытался адаптировать их под свои нужды. Я думаю, что я чертовски близок с этим, но не могу понять, чего мне здесь не хватает.

В соответствии с моим пониманием, мой ScrollViewer.ItemsControl должен содержать мой x:Key="Recipients" DataTemplate, который должен реализовывать мой x:Key="RecipientChip" DataTemplate, поскольку в моем наборе IEnumerable<Patient>, называемом Patients, содержится Patient. 1016 *

Не думаю, что я правильно связываю вещи, потому что, когда я строю, я не вижу ничего напечатанного. Это не выдает никаких ошибок в моей вкладке вывода, хотя я не уверен, что происходит. Мой Patients IEnumeral заполнен как индексированный объект, как и ожидалось. Может кто-нибудь помочь мне понять, почему мои чипы не отображаются и как проходит поток привязок go? Мне кажется, что я передаю Patient через ScrollViewer.ItemsControll к ссылочным элементам управления, но, может быть, я просто слишком много читаю?

Вот мой код:

XAML

    <Page.Resources>
        <DataTemplate x:Key="RecipientChip">
            <StackPanel>
                <materialDesign:Chip
                    Content="{Binding Patient.Name}">
                    <materialDesign:Chip.Icon>
                        <Image
                            Source="{Binding Patient.Image}" />
                    </materialDesign:Chip.Icon>
                </materialDesign:Chip>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="Recipients">
            <StackPanel>
                <Label Content="Recipients:" Background="Gray" FontSize="16" />
                <ItemsControl x:Name="Recipients" ItemsSource="{Binding Patients}" ItemTemplate="{StaticResource RecipientChip}" >
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel Orientation="Horizontal" ScrollViewer.HorizontalScrollBarVisibility="Disabled" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>

    </Page.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="32*"/>
            <ColumnDefinition Width="126*"/>
            <ColumnDefinition Width="Auto" MinWidth="66.999"/>
            <ColumnDefinition Width="193*"/>
            <ColumnDefinition Width="32*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>

        <materialDesign:Card
            Background="{DynamicResource PrimaryHueLightBrush}"
            Foreground="{DynamicResource PrimaryHueLightForegroundBrush}"
            Grid.Row="0"
            Grid.Column="1"
            Grid.RowSpan="2"
            Grid.ColumnSpan="3"
            Padding="8"
            Margin="0,65,0,50">
            <StackPanel>
                <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
                    <ItemsControl ItemTemplate="{StaticResource Recipients}" />
                </ScrollViewer>
            </StackPanel>
        </materialDesign:Card>

Код сзади:

    public partial class EmailMessageView : Page
    {

        public EmailMessageView(Email email)
        {
            InitializeComponent();

            Email = email;
            Patients = email.Patients.Data;
            EmailContent.NavigateToString(email.Content);
        }

        public Email Email;
        public IEnumerable<Patient> Patients;
    }

Пациенты

-[0]    {Mable} NotificationLinkApp.Models.Patient
        Address "9930 Somewhere St. "   string
        Age 18  double
+       Birthday    {NotificationLinkApp.Models.CarbonDate} NotificationLinkApp.Models.CarbonDate
        City    "Anywhere"  string
        CommunicationId 3   int?
+       CreatedAt   {NotificationLinkApp.Models.CarbonDate} NotificationLinkApp.Models.CarbonDate
        Email   "Mable.Lang@example.com"    string
        FirstName   "Mable" string
        Gender  1   int
        HomePhone   "555-555-4260"  string
        HomePhoneIsLandline null    int?
        Id  1490607 int
        Image   "pack://application:,,,/Resources/Images/user-unknown.png"  string
        IsEmail 1   int?
        IsMail  1   int?
        IsPhone 1   int?
        IsReviewRequest 1   int?
        IsText  1   int?
        LanguageId  25493   int?
        LastName    "Lang"  string
        Latitude    "40.527834" string
        Longitude   "-122.318749"   string
        Name    "Mable Lang"    string
        OfficeId    2   int
        ParentId    null    string
        PreferredConfidential   ""  string
        PreferredConfirm    ""  string
        PreferredContact    ""  string
        PreferredRecall ""  string
        ReferenceId "4634"  string
        SSN null    string
        State   "New Mexico"    string
+       UpdatedAt   {NotificationLinkApp.Models.CarbonDate} NotificationLinkApp.Models.CarbonDate
        WirelessPhone   "555-555-4745"  string
        WorkPhone   "555-555-3226"  string
        Zip "90134" string
        _age    0   double
        _email  "Mable.Lang@example.com"    string
        _homePhone  "555-555-4260"  string
        _image  ""  string
        _wirelessPhone  "555-555-4745"  string
        _workPhone  "555-555-3226"  string

1 Ответ

0 голосов
/ 07 апреля 2020

В итоге я смог заставить его работать, упростив код, а также установив DataContext для пациентов. Я продолжал использовать встроенную функциональность WrapPanel, чтобы мои «фишки» располагались горизонтально и переносились на новую строку, очень похожую на текст. Вот рабочий код.

XAML

    <Page.Resources>
        <DataTemplate x:Key="RecipientChip">
            <StackPanel>
                <materialDesign:Chip
                    Background="#FFFFFFFF"
                    Content="{Binding Name}" Click="Chip_Clicked">
                    <materialDesign:Chip.Icon>
                        <Image
                            Source="{Binding Image}" />
                    </materialDesign:Chip.Icon>
                </materialDesign:Chip>
            </StackPanel>
        </DataTemplate>
    </Page.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="32*"/>
            <ColumnDefinition Width="126*"/>
            <ColumnDefinition Width="Auto" MinWidth="66.999"/>
            <ColumnDefinition Width="193*"/>
            <ColumnDefinition Width="32*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>

        <materialDesign:Card
            Background="{DynamicResource PrimaryHueLightBrush}"
            Foreground="{DynamicResource PrimaryHueLightForegroundBrush}"
            Grid.Row="0"
            Grid.Column="1"
            Grid.RowSpan="2"
            Grid.ColumnSpan="3"
            Padding="8"
            Margin="0,65,0,50">
            <StackPanel>
                <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
                    <StackPanel>
                        <Label Content="Recipients:" FontSize="16" />
                        <ItemsControl ItemsSource="{Binding}"  ItemTemplate="{StaticResource RecipientChip}">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel IsItemsHost="True" />
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                        </ItemsControl>
                    </StackPanel>
                </ScrollViewer>
            </StackPanel>
        </materialDesign:Card>

        <WebBrowser Name="EmailContent" Grid.Row="1" Grid.Column="1" Grid.RowSpan="5" Grid.ColumnSpan="3" Margin="0,52,0,10"/>

    </Grid>

Код позади

    public EmailMessageView(Email email)
    {
        InitializeComponent();

        Email = email;
        Patients = email.Patients.Data;
        EmailContent.NavigateToString(email.Content);
        DataContext = Patients;
    }

    public Email Email;
    public IEnumerable<Patient> Patients;
...