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