我有一个列表视图控件,它使用DataTemplate来绑定数据。 在创建依赖项之后,绑定使用简单的字符串,但在绑定类属性时不起作用。如果我将数据绑定到textBlock它可以工作,但如果我将相同的东西绑定到我的用户控件它不起作用。
这是我的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 string NameText
{
get { return (string)GetValue(NameTextProperty); }
set { SetValue(NameTextProperty, value); }
}
public static readonly DependencyProperty NameTextProperty =
DependencyProperty.Register("NameText", typeof(string), typeof(UserSelectRibbon),null);
public UserSelectRibbon()
{
InitializeComponent();
DataContext = this;
}
这是我的简单用户类:
public class User {
public string Name { get; set; }
public int Age { get; set; }
public int Playlist { get; set; }
}
SO: 在XAML中如果我这样做:WORKS
<Views:UserSelectRibbon NameText ="Some text here" />
这将起作用并将文本添加到用户控件
中的TextBlockBUT: 在XAML中,如果我这样做:不要“工作
<Views:UserSelectRibbon NameText ="{Binding Name}" />
我想知道为什么没有绑定它可以工作,但它不适用于绑定
答案 0 :(得分:4)
问题在于您的DataContext
:
public UserSelectRibbon()
{
InitializeComponent();
DataContext = this;
}
这对以下内容有影响:
<Views:UserSelectRibbon NameText ="{Binding Name}" />
在此处,DataContext
已更改为Views:UserSelectRibbon
,因此您无法再绑定到外部DataContext
的任何内容。
解决方案:不要从内部将DataContext
的{{1}}设置为自身。 <强>从不!强>
相反,请将其设置在usercontrols树中的元素上,或使用某些UserControl
或RelativeSource
绑定。
内部DataContext的解决方案:
ElementName
和
<UserControl ...>
<Grid x:Name="grid1">
<TextBlock Text="{Binding NameText}"/>
</Grid>
</UserControl>
使用RelativeSource的解决方案(您可以使用public UserSelectRibbon()
{
InitializeComponent();
grid1.DataContext = this; // set DataContext on inner control instead of the usercontrol itself
}
基类型或您的特定用户控件内部类型):
UserControl
ElementName的解决方案:
<TextBlock Text="{Binding NameText,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
答案 1 :(得分:-1)
我最近用itemsControl做了类似的事情。我可能会忘记一切。 无论如何,有一种更简单的方法,然后从项目本身直接绑定。相反,你从c#中调用该项目并在那里绑定。之后
Mainpage()
{
InitializeComponent();
}
仍然在括号中,您应该添加:
List<SampleItem> = new List<SampleItem>;
items.Add({NameText = Name});
lbusers.ItemsSource = items;
括号外:
public class SampleItem{
public string Name {get; set;}
}
您可以根据需要添加items.Add行,以及将显示的项目数。