2013-04-08 130 views
0

我想创建一个包含列表框的用户控件,我无法弄清楚如何正确设置数据绑定。Silverlight用户控件数据绑定

在MainForm.xaml(MyItems是在视图模型中定义的的ObservableCollection):

<my:ItemsList Items="{Binding MyItems}"/> 

用户控逆变:

public partial class ItemsList : UserControl 
{ 
    public ItemsList() 
    { 
     InitializeComponent(); 
    } 

    public IEnumerable Items 
    { 
     get { return (IEnumerable)GetValue(ItemsProperty); } 
     set { SetValue(ItemsProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsProperty = 
     DependencyProperty.Register("Items", typeof(IEnumerable), typeof(ItemsList), null); 
} 

而XAML(省略命名空间声明):

<UserControl x:Class="MyApp.Controls.ItemsList"> 
    <phone:LongListSelector ItemsSource="{Binding Items}"> 
     <phone:LongListSelector.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding ItemName}" /> 
      </DataTemplate> 
     </phone:LongListSelector.ItemTemplate> 
    </phone:LongListSelector> 
</UserControl> 

我得到的错误:BindingExpression路径错误:'MyApp.V上找不到'Items'属性iewModels.MainViewModel'?!?

回答

1

我缺少的是设置在用户控件的构造函数列表框的数据上下文...

LayoutRoot.DataContext = this; 
-1

在您的xaml中,您需要添加对viewmodel的引用并将其作为控件的datacontext。

<UserControl xmlns:local="clr-namespace:"myproject.mynamespace;assembly=myproject"> 
     <UserControl.Resources> 
      <local:myviewmodel x:key="viewModel"/> 
     </UserControl.Resources> 
     <UserControl.DataContext> 
      <Binding Source="{StaticResource viewModel}"/> 
     </UserControl.DataContext> 
     <phone:LongListSelector ItemsSource="{Binding Items}"> 
      <phone:LongListSelector.ItemTemplate> 
      <DataTemplate> 
      <TextBlock Text="{Binding ItemName}" /> 
      </DataTemplate> 
     </phone:LongListSelector.ItemTemplate> 
     </phone:LongListSelector> 
    </UserControl> 

只是注意:您可以使用的DisplayMemberPath =“ITEMNAME”属性,而不是数据模板,除非你需要以某种方式对文本块进行交互。 希望这有助于。

+0

这感觉不对,控制不知道该视图模型(在设计时)。我打算在不同视角模型的几个不同地方使用该控件。 – 2013-04-08 19:56:26

+0

我的DataTemplate比示例代码复杂一些... – 2013-04-08 19:59:05

+0

我可能错过了第一次看它。您可能正在寻找使用绑定到c#文件中的属性或依赖项属性的控件标记上的模板绑定 – RKaufman 2013-04-08 21:14:23

0

检查:你用你的页面的正确的DataContext(必须是你的视图模型)?

用户控逆变必须是:

public partial class ItemsList : UserControl 
{ 
    public ItemsList() 
    { 
     InitializeComponent(); 
    } 

    public IEnumerable Items 
    { 
    get { return (IEnumerable)GetValue(ItemsProperty); } 
    set { SetValue(ItemsProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(IEnumerable), typeof(ItemsList), new PropertyMetadata(ItemsChanged)); 

    private static void ItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var controll = (ItemsList)d; 
     var val = (IEnumerable)e.NewValue; 
     controll.lls.ItemSource = val; 
    } 

的XAML

<UserControl x:Class="MyApp.Controls.ItemsList"> 
    <phone:LongListSelector x:name="lls"> 
     <phone:LongListSelector.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding ItemName}" /> 
      </DataTemplate> 
     </phone:LongListSelector.ItemTemplate> 
    </phone:LongListSelector> 
</UserControl> 

希望其帮助