Silverlight:为网格或UIElement设置数据上下文不起作用

时间:2011-05-05 15:26:01

标签: silverlight mvvm data-binding uielement

我错过了什么应该是一个直接的约束,我希望有人可以指出我正确的方向。

我有一个SL应用程序,它有一个名为PeopleView Model的视图模型,其中包含一个人的数量或属性(名称地址等) 该页面由用户控件,文本框和gridview

组成

用户控制代码

        <frm:LabelFieldContainer Width="145" 
                             Height="42"
                             Margin="12,12,0,0"
                             HorizontalAlignment="Left"
                             VerticalAlignment="Top"
                             MyContent="{Binding FirstName}"
                             MyLabel="{StaticResource lblFirstName}" />
    <frm:LabelFieldContainer Width="178" 
                             Height="42"
                             Margin="166,12,0,0"
                             HorizontalAlignment="Left"
                             VerticalAlignment="Top"
                             MyContent="{Binding LastName}"
                             MyLabel="{StaticResource lblLastName}"  />
</Grid>

此容器由另一个用户控件组成,该控件绑定到资源字典以提取标签名称,然后是一个内容字段,该字段将绑定到从我的视图模型(MyContent)返回的属性。这里的目标是创建一个通用控件,显示集合中的标签名称和值。即。名字:John目前,标签用于绑定资源字典,但值的绑定(MyContent)不返回任何内容。

这是MainPage.xaml的xaml

<Grid x:Name="LayoutRoot" Background="White">
    <uc:AddressContainer />
    <TextBlock Width="200" 
               Height="50"
               Margin="101,71,99,179"
               FontSize="12"
               Foreground="Black"
               Text="{Binding LastName}" />
    <telerik:RadGridView Name="GridView1" Margin="0,140,0,6"
                         HorizontalAlignment="Stretch"
                         VerticalAlignment="Stretch"
                         AutoGenerateColumns="True"
                         IsFilteringAllowed="True">
    </telerik:RadGridView>

和mainpage.xaml背后的代码是

    public partial class MainPage : UserControl
{
    //binding of view model to user control
    public PeopleViewModel PeopleView
    {
        get { return (PeopleViewModel)GetValue(PeopleViewProperty); }
        set { SetValue(PeopleViewProperty, value); }
    }

    // Using a DependencyProperty as the backing store for PeopleView.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty PeopleViewProperty =
        DependencyProperty.Register("PeopleView", typeof(PeopleViewModel), typeof(MainPage), new PropertyMetadata(new PeopleViewModel()));


    public MainPage()
    {
        InitializeComponent();
        this.LayoutRoot.DataContext = PeopleView.AllPeople;  //tried this but no luck
        this.GridView1.ItemsSource = PeopleView.AllPeople; //bound to a grid view for testing returns 

    }

我插入一个网格只是为了测试,它返回值很好。但是,我尝试将主视图的DataContext绑定到集合,以便我可以在usercontrol或我在主页面中添加的测试文本块中填充绑定字段。

有人能指出我如何正确地将UIElements绑定到ItemsSource之外的集合。我总是为网格或列表框项目做这个没有问题,但现在试图表示某些东西(UI中的单个字段)我卡住了。 的更新:

经过一段短暂的精神失误之后,我重新启动了,因为我绑定了一个集合,我将usercontrol放入一个列表框,这里是更新的主页xaml

    <Grid x:Name="LayoutRoot" Background="White">
    <ListBox ItemsSource="{Binding}" Margin="0,0,0,166">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <uc:AddressContainer />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <telerik:RadGridView Name="GridView1" Margin="0,140,0,6"
                         HorizontalAlignment="Stretch"
                         VerticalAlignment="Stretch"
                         AutoGenerateColumns="True"
                         IsFilteringAllowed="True">
    </telerik:RadGridView>

我将mainpage.xaml.cs文件中的数据上下文更新为

        public MainPage()
    {
        InitializeComponent();
        this.DataContext = PeopleView.AllPeople;  //updated here  
    }

我在列表框中获得了记录(2)的准确返回,但是在用户控件(内容字段)中仍未发生绑定以显示集合中返回的值

任何指针仍然会受到赞赏。

1 个答案:

答案 0 :(得分:2)

找到答案。在之前的测试中,我在UserControl中设置了一个基本模型的数据源。不要问为什么......但是绑定是否覆盖了从主页面设置的绑定。在删除该数据引用之后,UI现在正确地将用户控件绑定到集合。