UWP 社区工具包中的主从视图

Posted

技术标签:

【中文标题】UWP 社区工具包中的主从视图【英文标题】:Master-Details view in UWP Community Toolkit 【发布时间】:2018-02-25 11:51:37 【问题描述】:

我尝试从 UWP Community Toolkit 2.0 实现 Master-Details 视图。我从 uwp 社区工具包示例应用程序中复制了示例代码。但似乎数据没有正确绑定。现在主详细信息视图为空。谁能帮我解决我哪里出错了?

XAML 代码:`

<Page
    x:Class="FaceIdentification.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:FaceIdentification"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"
    xmlns:models="using:Microsoft.Toolkit.Uwp.SampleApp.Models"
    mc:Ignorable="d"  >

    <Grid Background="ThemeResource ApplicationPageBackgroundThemeBrush">
        <controls:MasterDetailsView ItemsSource="Binding Emails"
                                    NoSelectionContent="Select an item to view"
                                    Foreground="Black">
            <controls:MasterDetailsView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,8">
                        <TextBlock Text="Binding From" 
                                   Style="ThemeResource SubtitleTextBlockStyle"/>
                        <TextBlock Text="Binding Subject" 
                                   Style="ThemeResource BodyTextBlockStyle" 
                                   Foreground="ThemeResource Brush-Blue-01" 
                                   MaxLines="1"/>
                        <TextBlock Text="Binding Body" 
                                   Style="ThemeResource BodyTextBlockStyle" 
                                   Opacity=".6" 
                                   MaxLines="1"/>
                    </StackPanel>
                </DataTemplate>
            </controls:MasterDetailsView.ItemTemplate>
            <controls:MasterDetailsView.DetailsTemplate>
                <DataTemplate>
                    <RelativePanel Margin="24">
                        <controls:RoundImageEx x:Name="FromEllipse"
                                               Source="Binding Thumbnail"
                                               Width="50"
                                               Height="50"
                                               CornerRadius="999"/>
                        <TextBlock Text="Binding From" 
                                   Style="ThemeResource SubtitleTextBlockStyle" 
                                   RelativePanel.RightOf="FromEllipse" 
                                   Margin="12,-6,0,0"/>
                        <TextBlock x:Name="SubjectLine"
                                   Text="Binding Subject" 
                                   Style="ThemeResource BodyTextBlockStyle" 
                                   RelativePanel.Below="FromEllipse"
                                   Margin="0,12,0,0"/>
                        <TextBlock x:Name="Body" 
                                   Text="Binding Body" 
                                   Style="ThemeResource BodyTextBlockStyle" 
                                   TextWrapping="Wrap" 
                                   RelativePanel.Below="SubjectLine" 
                                   Margin="0,12,0,0"/>
                    </RelativePanel>
                </DataTemplate>
            </controls:MasterDetailsView.DetailsTemplate>
            <controls:MasterDetailsView.NoSelectionContentTemplate>
                <DataTemplate>
                    <StackPanel HorizontalAlignment="Center" 
                                VerticalAlignment="Center">
                        <SymbolIcon Symbol="Mail" 
                                    RenderTransformOrigin=".5,.5">
                            <SymbolIcon.RenderTransform>
                                <CompositeTransform 
                                  ScaleX="2" 
                                  ScaleY="2"/>
                            </SymbolIcon.RenderTransform>
                        </SymbolIcon>
                        <TextBlock Text="Binding" 
                                   FontSize="24" 
                                   Margin="0,12"/>
                    </StackPanel>
                </DataTemplate>
            </controls:MasterDetailsView.NoSelectionContentTemplate>
        </controls:MasterDetailsView>
    </Grid>
</Page>

`

CS 代码:

public sealed partial class MainPage : Page

    public class Email
    
        public string From  get; set; 
        public string Subject  get; set; 
        public string Body  get; set; 
    
    List<Email> Emails = new List<Email>
    (
        new Email  From = "Steve Johnson", Subject = "Lunch Tomorrow", Body = "Are you available for lunch tomorrow? A client would like to discuss a project with you."
    );
    public MainPage()
    
        this.InitializeComponent();
    

我的输出: 我在谷歌搜索了很多。但由于这是一项新功能,因此没有任何帮助或教程可用。希望 *** 社区帮助我

【问题讨论】:

代码是您的代码吗?看起来它没有更新视图。如果将其更改为 ObservableCollection&lt;Email&gt; 会发生什么? 1.我在这里给出了我所有的代码。 2. 不。那没用。 1.调试时输出窗口中是否有任何绑定错误? 2.我认为您的问题可能是由于 xaml 不知道正确的 DataContext 进行绑定,请尝试使用 x:Bind 而不是 Binding 输出窗口中没有错误。我将尝试 x:Bind 并报告。 【参考方案1】:

您正在将 MasterDetailsView 的 ItemsSource 绑定到 Emails,但您尚未为页面或 MasterDetailsView 设置 DataContext。要解决这个问题,您可以将 DataContext 设置为页面本身,或者使用 x:Bind 而不是绑定

使用 DataContext:

public MainPage()

    this.InitializeComponent();
    DataContext = this;

使用 x:Bind

<controls:MasterDetailsView ItemsSource="x:Bind Emails"/>

【讨论】:

【参考方案2】:

虽然这是一个相当古老的问题,但由于它没有答案,我将添加我刚刚发现的问题。

问题是双重的:

    正如 Shawn Kendrot 的回答中所述,需要使用 x:Bind而不是 Binding。 XAML 中的 DataTemplate 也需要设置 x:DataType。

这两项一起完成将解决问题。正确的 XAML 代码粘贴在下面:

    <controls:MasterDetailsView BackButtonBehavior="Automatic" ItemsSource="x:Bind inbox" NoSelectionContent="Select an item to view" CompactModeThresholdWidth="720">
        <controls:MasterDetailsView.ItemTemplate>
            <DataTemplate x:DataType="local:Email">
                <StackPanel Margin="8,0">
                    <TextBlock Text="x:Bind From" Style="ThemeResource SubtitleTextBlockStyle" />
                    <TextBlock Text="x:Bind Subject" Style="ThemeResource BodyTextBlockStyle" Foreground="ThemeResource Brush-Blue-01" MaxLines="1" />
                    <TextBlock Text="x:Bind Body" Style="ThemeResource BodyTextBlockStyle" Opacity="0.6" MaxLines="1" />
                </StackPanel>
            </DataTemplate>
        </controls:MasterDetailsView.ItemTemplate>
        <controls:MasterDetailsView.DetailsTemplate>
            <DataTemplate x:DataType="local:Email">
                <RelativePanel Margin="24">
                    <controls:ImageEx x:Name="FromEllipse" Source="x:Bind Thumbnail" Width="50" Height="50" CornerRadius="999" />
                    <TextBlock Text="x:Bind From" Style="ThemeResource SubtitleTextBlockStyle" RelativePanel.RightOf="FromEllipse" Margin="12,-6,0,0" />
                    <TextBlock x:Name="SubjectLine" Text="x:Bind Subject" Style="ThemeResource BodyTextBlockStyle" RelativePanel.Below="FromEllipse" Margin="0,12,0,0" />
                    <TextBlock x:Name="Body" Text="x:Bind Body" Style="ThemeResource BodyTextBlockStyle" TextWrapping="Wrap" RelativePanel.Below="SubjectLine" Margin="0,12,0,0" />
                </RelativePanel>
            </DataTemplate>
        </controls:MasterDetailsView.DetailsTemplate>

【讨论】:

以上是关于UWP 社区工具包中的主从视图的主要内容,如果未能解决你的问题,请参考以下文章

UWP 社区工具包 DataGrid 不显示数据

UWP 社区工具包 DataGrid onecoreuap 错误

WPF 桌面应用程序,Windows 10 通知 Toast 2016(UWP 社区工具包)

将 Ui 事件绑定到 UWP 中的命令 [重复]

uwp GridView selectedItem 弹出窗口

uwp GridView selectedItem 弹出窗口