XAML绑定到子集合

时间:2016-08-23 08:19:06

标签: wpf windows xaml binding uwp

在Windows UWP项目中,我尝试绑定到此类中的以下属性

using System;
using System.Collections.ObjectModel;

namespace IAmOkShared.Models
{
   public class Client
    {
        public Guid clientId { get; set; }
        public string lastname { get; set; }
        public DateTime timestamp { get; set; }

        //- List af addresses of this client
        public ObservableCollection<Address> clientaddresses;

        public Client ()
        {
            clientId = Guid.Empty;
            lastname = string.Empty;
            timestamp = DateTime.Today;

            clientaddresses = new ObservableCollection<Address>();
       }
    }
 }

绑定到clientId和lastname没有问题,但是无法绑定到clientaddresses的一个或多个属性(例如,city,country)

我的XAML:

    <DataTemplate x:Name="DetailTemplate" x:DataType="models:Client">
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <TextBlock x:Name="LastNameTextBlock" Text="{Binding lastname}" />
            </StackPanel>
            <StackPanel Orientation="Vertical">
                <TextBlock x:Name="AddressTextBlock" Text="{Binding clientaddresses[0].city}" />
            </StackPanel>
        </StackPanel>
    </DataTemplate>

知道如何解决这个问题吗? 史蒂芬

2 个答案:

答案 0 :(得分:1)

您绑定到字段而不是属性

public ObservableCollection<Address> clientaddresses;

将此更改为

public ObservableCollection<Address> Clientaddresses { get; private set; }

因此无法在viewmodel之外实例化,然后绑定应该起作用。

此外,您可以为地址创建其他数据模板,并在客户端的数据模板中使用整个集合,因为这样您就无法获得索引。如果您的ClientAddresses集合为空,则绑定异常。

<DataTemplate x:DataType="models:Address">
    <TextBlock x:Name="AddressTextBlock" Text="{Binding city}" />
<DataTemplate>

<DataTemplate x:Name="DetailTemplate" x:DataType="models:Client">
    <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
            <TextBlock x:Name="LastNameTextBlock" Text="{Binding lastname}" />
        </StackPanel>
        <StackPanel Orientation="Vertical">
            <ItemsControl ItemsSource="{Binding ClientAddresses}"/>
        </StackPanel>
    </StackPanel>
</DataTemplate>

另请注意,您的模型未实现INotifyPropertyChanged,因此当模型属性发生更改时,您的UI将不会更新。

后端私有字段的约定也是以小写字符开头,对于使用INotifyPropertyChanged的属性,你应该用大写字母启动属性。

private int myProperty;
public int MyProperty { get { ... } set { ... }}

答案 1 :(得分:0)

这就是为什么我们在其中创建ViewModel及其他属性

public Address ClientFirstAddress
{
    get {return clientaddresses[0].city;}
}

然后将其绑定到View, 记得在设置clientaddresses集合

时为此属性调用NofityPropertyChanged