C# UWP DependencyProperty绑定和DataTemplate绑定

C# UWP DependencyProperty绑定和DataTemplate绑定,c#,xaml,uwp,win-universal-app,dependency-properties,C#,Xaml,Uwp,Win Universal App,Dependency Properties,我有一个playlymontrol(它是一个UserControl),其中一个变量ShowAlbumText声明如下: public bool ShowAlbumText { get => (bool)GetValue(ShowAlbumTextProperty); set => SetValue(ShowAlbumTextProperty, value); } public static readonly Depend

我有一个
playlymontrol
(它是一个
UserControl
),其中一个变量
ShowAlbumText
声明如下:

    public bool ShowAlbumText
    {
        get => (bool)GetValue(ShowAlbumTextProperty);
        set => SetValue(ShowAlbumTextProperty, value);
    }
    public static readonly DependencyProperty ShowAlbumTextProperty = DependencyProperty.Register("ShowAlbumText", 
                        typeof(bool),
                        typeof(PlaylistControl),
                        new PropertyMetadata(true));
<ListView>
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:Music">
            <local:PlaylistControlItem DataContext="{x:Bind}" ShowAlbumText="{Binding ShowAlbumText}">
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
并且
ShowAlbumText
ListView.ItemTemplate
的xaml中以以下方式使用
PlayControl

    public bool ShowAlbumText
    {
        get => (bool)GetValue(ShowAlbumTextProperty);
        set => SetValue(ShowAlbumTextProperty, value);
    }
    public static readonly DependencyProperty ShowAlbumTextProperty = DependencyProperty.Register("ShowAlbumText", 
                        typeof(bool),
                        typeof(PlaylistControl),
                        new PropertyMetadata(true));
<ListView>
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:Music">
            <local:PlaylistControlItem DataContext="{x:Bind}" ShowAlbumText="{Binding ShowAlbumText}">
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

但是,此
绑定
报告一个错误

错误:BindingExpression路径错误:“ShowAlbumText”属性不正确 在“SMPlayer.Models.Music”中找到。绑定表达式: Path='ShowAlbumText'DataItem='SMPlayer.Models.Music';目标元素 是“SMPlayer.Controls.playControlItem”(Name='null');目标 属性为“ShowAlbumText”(类型为“Boolean”)

那么,如何将
ShowAlbumText
绑定到
playControlItem
?我理解
ShowAlbumText
不是
Music
的属性(
Music
是我的视图模型)。它是my
UserControl
DependencyProperty
。更一般的问题是,如何将我的
UserControl
中的
dependencProperty
ItemsSource中的
ViewModel
绑定到数据模板

来源


源。

可以使用ElementName将绑定点绑定到XAML中元素的属性,而不是数据上下文的属性。在您的例子中,您希望该元素是UserControl/playControl

为UserControl元素指定一个名称:

<UserControl x:Class="WhateverYourNamespaceIs.PlaylistControl"
    ...
    x:Name="Foo">

将绑定指向具有该名称的元素:

<local:PlaylistControlItem DataContext="{x:Bind}" ShowAlbumText="{Binding ElementName=Foo, Path=ShowAlbumText}">

为页面指定一个列表视图的名称,如下所示

<Page
    x:Class="TestUwpApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestUwpApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    Name="MainPageName">

然后像这样绑定属性“ShowAlbumText”

<ListView>
<ListView.ItemTemplate>
    <DataTemplate x:DataType="data:Music">
        <local:PlaylistControlItem DataContext="{x:Bind}" ShowAlbumText="{Binding ElementName=MainPageName,Path=DataContext.ShowAlbumText}">
    </DataTemplate>
</ListView.ItemTemplate>