2013-04-08 127 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> 

希望其幫助