首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将数据库绑定到ItemsControl

如何将数据库绑定到ItemsControl
EN

Stack Overflow用户
提问于 2014-02-11 01:53:16
回答 1查看 84关注 0票数 0

我有一个SL5项目,在这个项目中,我试图将一个集合绑定到一个ItemsControl,我一直得到这个错误:

代码语言:javascript
复制
BindingExpression path error: 'ItemName' property not found on 'EventViewer.Data.ViewModels.ProductListModel' 'EventViewer.Data.ViewModels.ProductListModel' (HashCode=7414170). BindingExpression: Path='ItemName' DataItem='EventViewer.Data.ViewModels.ProductListModel' (HashCode=7414170); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'Text' (type 'System.String')..
BindingExpression path error: 'Price' property not found on 'EventViewer.Data.ViewModels.ProductListModel' 'EventViewer.Data.ViewModels.ProductListModel' (HashCode=7414170). BindingExpression: Path='Price' DataItem='EventViewer.Data.ViewModels.ProductListModel' (HashCode=7414170); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'Text' (type 'System.String')..
BindingExpression path error: 'Description' property not found on 'EventViewer.Data.ViewModels.ProductListModel' 'EventViewer.Data.ViewModels.ProductListModel' (HashCode=7414170). BindingExpression: Path='Description' DataItem='EventViewer.Data.ViewModels.ProductListModel' (HashCode=7414170); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'Text' (type 'System.String')..

我在ProductQtyItem中有这些属性,并且似乎正确地设置了数据绑定。以下是我所拥有的:

XAML:

代码语言:javascript
复制
<sdk:ChildWindow    
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"   
    xmlns:EventViewer="clr-namespace:EventViewer" 
    xmlns:ViewModels="clr-namespace:EventViewer.Data.ViewModels"    
    xmlns:converters="clr-namespace:EventViewer.Converters"
    x:Class="EventViewer.PurchaseWindow"
    Title="Purchase"  
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch"
    Width="539" Height="550">
    <sdk:ChildWindow.Resources>

        <converters:BooleanVisibilityConverter x:Key="BooleanVisibilityConverter"/>
        <converters:NumericCurrencyConverter x:Key="NumericCurrencyConverter"/>

        <ControlTemplate x:Key="ProductItemTemplate" TargetType="ItemsControl">
            <Grid Margin="3">

                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <TextBlock Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2" VerticalAlignment="Center" 
                           Style="{StaticResource ProductNameTextBlockStyle}"
                           Text="{Binding ItemName, Mode=OneWay}"/>

                <TextBlock Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center" 
                           Style="{StaticResource ProductPriceTextBlockStyle}"
                           Text="{Binding Price, Converter={StaticResource NumericCurrencyConverter}, Mode=OneWay}" />

                <TextBlock Grid.Column="1" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" TextWrapping="Wrap" 
                           Text="{Binding Description, Mode=OneWay}"/>
            </Grid>
        </ControlTemplate>
    </sdk:ChildWindow.Resources>
    <Grid x:Name="LayoutRoot">
        <Grid.DataContext>
            <ViewModels:ProductListModel/>
        </Grid.DataContext>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Viewbox Stretch="Uniform" StretchDirection="DownOnly" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="100" 
            DataContext="{Binding ImageData}">
            <Image Source="{Binding ImagePath, Mode=OneWay}" ImageOpened="Image_ImageOpened"/>
        </Viewbox>

        <ItemsControl 
            HorizontalAlignment="Left" Margin="0,105,0,0" VerticalAlignment="Top" Width="521" Height="377"          
            Template="{StaticResource ProductItemTemplate}" 
            ItemsSource="{Binding ProductQtyItems}"/>

        <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Grid.Row="1" />
    </Grid>
</sdk:ChildWindow>

接下来的代码是如何将ProductListModel连接到上述XAML代码的LayoutRoot.DataContext。因此,如果我正确理解,ItemsControl的绑定将绑定到List ProductQtyItems of ProductListModel。那么,模板不会将数据源设置为ProductQtyItem吗?我遗漏了什么?

下面是代码的其余部分:

这是填充数据绑定的代码:

代码语言:javascript
复制
public static void Display(FrameworkElement parent, ImageData imageData)
{
    var purchaseWindow = new PurchaseWindow();

    var productQtyItems = new List<ProductQtyItem>();
    foreach (var p in SystemSettings.GetInstance().ProductList.Collection)
    {
        int qty = 0;
        imageData.ProductListItemQty.TryGetValue(p.Id, out qty);
        productQtyItems.Add(ProductQtyItem.Create(p, qty));
    }

    purchaseWindow.LayoutRoot.DataContext = new ProductListModel
    {
        ImageData = imageData,
        ProductQtyItems = productQtyItems
    };

    purchaseWindow.Show();
}

下面是正在设置为LayoutRoot.Datacontext的模型:

代码语言:javascript
复制
public class ProductListModel : PropertyChangedBase
{
    private List<ProductQtyItem> _productQtyItems;
    private ImageData _imageData;

    public List<ProductQtyItem> ProductQtyItems
    {
        get { return _productQtyItems; }
        set { _productQtyItems = value; }
    }

    public ImageData ImageData
    {
        get { return _imageData; }
        set { _imageData = value; }
    }
}

最后,ProductQtyItem:

代码语言:javascript
复制
public class ProductQtyItem : PropertyChangedBase
{
    public static ProductQtyItem Create(ProductItem productItem, int qty)
    {
        return new ProductQtyItem
        {
            _productItem = productItem,
            _qty = qty,
        };
    }

    private ProductItem _productItem;
    private int _qty;

    public int Id { get { return _productItem.Id; } }
    public int SortOrder { get { return _productItem.SortOrder; } }
    public string ItemName { get { return _productItem.ItemName; } }
    public string Description { get { return _productItem.Description; } }
    public double Price { get { return _productItem.Price; } }
    public bool IsQtyEnabled { get { return _productItem.IsQtyEnabled; } }

    public int Qty
    {
        get { return _qty; }
        set
        {
            if (value != _qty)
            {
                _qty = value;
                NotifyPropertyChanged("Qty");
            }
        }
    }

    public override bool Equals(object obj)
    {
        var other = obj as ProductQtyItem;

        if (other == null)
            return false;

        return Id == other.Id;
    }

    public override int GetHashCode()
    {
        return Id;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-11 02:20:29

错误消息表示绑定到属性DataContextPriceDescription的控件的ProductListModel而不是ProductQtyItem

哪个模型/视图模型具有名为Collection的属性,Collection是什么类型的?我认为问题就在这里,如果它是ProductListModel类型的话。

更新:

响应您的更新,尝试更改ControlTemplate中的资源定义:

代码语言:javascript
复制
<ControlTemplate x:Key="ProductItemTemplate" TargetType="ItemsControl">..</ControlTemplate>

DataTemplate

代码语言:javascript
复制
<DataTemplate x:Key="ProductItemTemplate">..</DataTemplate>

然后绑定ItemsControlItemTemplate属性而不是Template属性:

代码语言:javascript
复制
<ItemsControl 
            HorizontalAlignment="Left" Margin="0,105,0,0" VerticalAlignment="Top" Width="521" Height="377"          
            ItemTemplate="{StaticResource ProductItemTemplate}" 
            ItemsSource="{Binding ProductQtyItems}"/>

PS :其实有太多的信息张贴,仍然不能直接复制,因为一些类的定义仍然缺失。下一次尝试使用简化的视图模型简化场景,删除无关的资源(样式、转换器),但要确保问题仍然出现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21691554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档