C# XAML绑定用户控件文本块将不显示绑定数据

C# XAML绑定用户控件文本块将不显示绑定数据,c#,xaml,data-binding,C#,Xaml,Data Binding,我有一个列表视图控件,它使用DataTemplate绑定数据。 在我创建了依赖项之后,绑定可以使用一个简单的字符串,但是在我绑定class属性时将不起作用。如果我将数据绑定到一个文本块,它会工作,但是如果我将相同的东西绑定到我的用户控件,它就不工作 这是我的XAML:LISTVIEW <ListView x:Name='lbUsers' Height='370' Canvas.Left='264'

我有一个列表视图控件,它使用DataTemplate绑定数据。 在我创建了依赖项之后,绑定可以使用一个简单的字符串,但是在我绑定class属性时将不起作用。如果我将数据绑定到一个文本块,它会工作,但是如果我将相同的东西绑定到我的用户控件,它就不工作

这是我的XAML:LISTVIEW

<ListView x:Name='lbUsers'
                 Height='370'
                 Canvas.Left='264'
                 Canvas.Top='183'
                 Width='1177'
                  Background='{x:Null}'>

            <ListView.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <Views:UserSelectRibbon NameText ="{Binding Name}" />
                        <Image Width='10' />
                    </WrapPanel>
                </DataTemplate>
            </ListView.ItemTemplate>

            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Width="{Binding (FrameworkElement.ActualWidth), 
            RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"
                               ItemWidth="{Binding (ListView.View).ItemWidth, 
            RelativeSource={RelativeSource AncestorType=ListView}}"
                               MinWidth="{Binding ItemWidth, RelativeSource={RelativeSource Self}}"
                               ItemHeight="{Binding (ListView.View).ItemHeight, 
            RelativeSource={RelativeSource AncestorType=ListView}}" />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>

        </ListView>
以下是我的简单用户类:

public class User {
    public string Name { get; set; }
    public int Age { get; set; }
    public int Playlist { get; set; }
}
因此: 在XAML中,如果我这样做:工作

  <Views:UserSelectRibbon NameText ="Some text here" /> 

这将起作用,并将文本添加到用户控件的TextBlock中

但是: 在XAML中,如果我这样做:不起作用



我想知道为什么它在没有绑定的情况下可以工作,但在绑定的情况下不能工作

问题在于您的
数据上下文

public UserSelectRibbon()
{
    InitializeComponent();
    DataContext = this;
}
这意味着:

<Views:UserSelectRibbon NameText ="{Binding Name}" />

使用RelativeSource的解决方案(您可以使用
UserControl
基本类型或您的特定usercontrols内部类型):


具有ElementName的解决方案:

<UserControl ...
             x:Name="myControl">
    <Grid>
        <TextBlock Text="{Binding NameText,ElementName=myControl}"/>
    </Grid>
</UserControl>

我最近用一个itemsControl做了类似的事情。不过我可能会忘记一切。 无论如何,有一种更简单的方法可以直接从项目本身绑定。相反,您可以从c#中调用项目,并在那里进行绑定。之后

Mainpage()
{
InitializeComponent();
}
仍然在括号中,您应该添加以下内容:

List<SampleItem> = new List<SampleItem>;
items.Add({NameText = Name});
lbusers.ItemsSource = items;

您可以添加项目。添加行的次数可以根据您的需要而定,这就是显示项目的次数。

这是因为当您查看声明时,
UserControl
外部看不到
public static readonly dependencProperty NameTextProperty=DependencyP>Register(“NameText”、typeof(string)、typeof(UserSelectRibbon)、null)
typeof
部分定义谁有权访问该属性。您可以使用普通文本设置它是因为正在设置支持属性。@XAMlMAX抱歉,这是错误的。typeof定义的是所有者,但属性值仍然可以从外部读取/写入。@grek40是的,您可以通过静态值设置它i、 e.“一些文本“但是,
绑定
将无法访问它,并且每次都会有一个
null
值。如果在
UserControl
声明中使用它,它将起作用,而在外部使用则不起作用。继续测试。@XAMlMAX好的,我继续尝试了,谢谢你浪费了我的时间,它当然可以正常工作。啊,我知道我错了,我很抱歉@grek40谢谢你的礼貌;-)
public UserSelectRibbon()
{
    InitializeComponent();
    grid1.DataContext = this; // set DataContext on inner control instead of the usercontrol itself
}
<TextBlock Text="{Binding NameText,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
<UserControl ...
             x:Name="myControl">
    <Grid>
        <TextBlock Text="{Binding NameText,ElementName=myControl}"/>
    </Grid>
</UserControl>
Mainpage()
{
InitializeComponent();
}
List<SampleItem> = new List<SampleItem>;
items.Add({NameText = Name});
lbusers.ItemsSource = items;
public class SampleItem{
public string Name {get; set;}
}