0

我正在尝试创建一个包含列表框的用户控件,但我不知道如何正确设置数据绑定。

在 MainForm.xaml 中(MyItems 是 ViewModel 中定义的 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.ViewModels.MainViewModel”上找不到“Items”属性?!?

4

3 回答 3

1

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

LayoutRoot.DataContext = this;
于 2013-04-09T00:29:51.503 回答
0

检查:您是否使用了正确的页面数据上下文(必须是您的 ViewModel)?

用户控件必须是:

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>

希望它的帮助

于 2013-04-09T06:06:47.990 回答
-1

在您的 xaml 中,您需要添加对视图模型的引用并使其成为控件的数据上下文。

    <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" 属性而不是数据模板,除非您需要以某种方式与文本块进行交互。希望这可以帮助。

于 2013-04-08T19:07:20.263 回答