Data binding WPF:在UserControl中数据绑定ListView不显示任何项
我很确定这是一个UserControl DataContext问题,但我没有看到它: 这是我的XAML:Data binding WPF:在UserControl中数据绑定ListView不显示任何项,data-binding,.net-3.5,binding,Data Binding,.net 3.5,Binding,我很确定这是一个UserControl DataContext问题,但我没有看到它: 这是我的XAML: <UserControl x:Class="WFT.Controls.DetailsBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wft="clr
<UserControl x:Class="WFT.Controls.DetailsBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wft="clr-namespace:WFT.Controls" >
<wft:CaptionedBox Caption="Details" Margin="1" >
<ListView ItemsSource="{Binding Map}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Key}" />
<GridViewColumn DisplayMemberBinding="{Binding Value}" />
</GridView>
</ListView.View>
</ListView>
</wft:CaptionedBox>
</UserControl>
这就是背后的代码:
public partial class DetailsBox : UserControl
{
ObservableCollection<KeyValuePair<string, string>> m_Map =
new ObservableCollection<KeyValuePair<string, string>>( );
public ObservableCollection<KeyValuePair<string, string>> Map
{ get { return m_Map; } }
public DetailsBox( )
{
InitializeComponent( );
DataContext = this;
}
public void Initialize( List<string> map )
{
IEnumerable<int> range = Enumerable.Range( 0, map.Count );
m_Map = new ObservableCollection<KeyValuePair<string, string>>(
range.Where( r => 0 == r % 2 && map[ r + 1 ].Trim( ) != "N/A" )
.Select( r => new KeyValuePair<string, string>( map[ r ], map[ r + 1 ] ) ).ToList( ) );
}
}
public部分类详细信息box:UserControl
{
可观测采集m_图=
新的可观察集合();
公共可观测收集图
{get{返回m_映射;}}
公共详细信息框()
{
初始化组件();
DataContext=this;
}
公共无效初始化(列表映射)
{
IEnumerable range=Enumerable.range(0,map.Count);
m_Map=新的可观测集合(
范围。其中(r=>0==r%2&&map[r+1]。修剪()!=“不适用”)
.Select(r=>newkeyvaluepair(map[r],map[r+1])).ToList();
}
}
在运行时,Map有八个项目,但ListView中没有显示任何内容。在一个独立的测试应用程序中,它使用DataContext=“{Binding RelativeSource={RelativeSource Self}}”
,但作为一个用户控件,这不起作用。正如您在上面看到的,我甚至尝试在构造函数中设置DataContext=this
谢谢 我从来没有弄明白如何在XAML中设置DataContext,但我通过执行以下操作完成了工作: 在XAML中,我向listview添加了
x:Name=“listview”
然后,在代码隐藏中,我将属性Map转换为dependencProperty
public ObservableCollection<KeyValuePair<string, string>> Map
{
get { return (ObservableCollection<KeyValuePair<string, string>>)GetValue( MapProperty ); }
set { SetValue( MapProperty, value ); }
}
public static DependencyProperty MapProperty = DependencyProperty.Register( "Map",
typeof( ObservableCollection<KeyValuePair<string, string>> ),
typeof( DetailsBox ),
new PropertyMetadata( new ObservableCollection<KeyValuePair<string, string>>( ) ) );
公共可见采集图
{
get{return(ObservableCollection)GetValue(MapProperty);}
set{SetValue(MapProperty,value);}
}
公共静态DependencyProperty映射属性=DependencyProperty.Register(“映射”,
类型(可观测采集),
类型(详细信息框),
新的PropertyMetadata(新的ObservableCollection());
删除
DataContext=this从构造函数中选择code>,并添加listview.DataContext=Map代码>在加载映射后初始化。是否设置了ListView的DataContext?乍一看,一切都很好,但我看不出DataContext是如何设置的。我编辑了这个问题以显示DataContext。我从教程中复制了这个。。。有没有办法指定这是针对ListView本身的?事实上,它是在XAML头中定义的;我的xaml是一个用户控件;RelativeSource绑定在窗口中对我有效,但在UserControl中无效(原始问题已编辑)。我尝试过的某些东西立即关闭了VS2008!