C# 将自定义控件绑定到列表<;T>;

C# 将自定义控件绑定到列表<;T>;,c#,xaml,data-binding,datacontext,inotifypropertychanged,C#,Xaml,Data Binding,Datacontext,Inotifypropertychanged,我有一个自定义控件-联系人卡: <Grid> <Grid.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FFD8B8EA"/> <GradientStop Color="White" Offset="1"/> &l

我有一个自定义控件-联系人卡:

<Grid>
    <Grid.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FFD8B8EA"/>
            <GradientStop Color="White" Offset="1"/>
        </LinearGradientBrush>
    </Grid.Background>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Image Source="images.jpg" />
    <StackPanel Grid.Column="1">
        <TextBlock Text="{Binding Path=name}" Foreground="Black" FontSize="20" />
        <TextBlock Text="{Binding Path=surname}" Foreground="Black" FontSize="20" />
    </StackPanel>
</Grid>

并且它不会更新卡…

问题在于您创建FourItems视图的方式。在这一行-

ContactCard CC = new ContactCard();
CC.DataContext = FullObjects.contacts[i];
if (i == 0)
{
   FI.FirstItem.Children.Add(CC);
}
您正在为
ContactCard
显式设置
DataContext
,然后将其完全更改为新的引用,除非手动重置DataContext,否则显然不会在UI上得到反映

相反,您应该拥有一个
ItemsControl
,并将其
ItemsSource
直接绑定到
联系人ObservableCollection
。您可以定义itemsControl的
ItemTemplate
,以表示一个ContactCard。这样,您将获得
CollectionChanged
可观察到的集合通知,UI将自动更新

视图可容纳四个控件(去掉StackPanel)-


现在,集合联系人中的任何更新都将由ItemsControl侦听,因为它绑定到它,您的UI将相应地更新。确保联系人是
observetecollection

您用
INotifyPropertyChanged
标记了您的问题,所以我想您知道这一点。这就是答案,您应该通过引发INPC的PropertyChanged事件来通知UI。但问题是我没有更改FullObjectt.contacts[0]属性,我用一个新的对象替换了该对象,因此PropertyChanged没有被引发ObservableCollection应该可以正常工作。您在设置时是否遇到任何错误?说真的,我不知道如何重建代码以使其成为ObservableCollection,是否应该将List更改为ObservableCollection,如下所示:class FullObject{public string spTimestamp{get;set;}public ObservableCollection contacts{get set;}公共字符串scTimestamp{get;set;}公共列表区域{get;set;}}是的,就是这样。它不工作吗?FI.ContactItems.ItemsSource=FullObjects.contacts;如果我的收藏中有4件物品,但如果我有100多件物品,这是一种情况?但是我只想在Flip Viev的页面上显示,这样您就只能绑定到收藏的四个项目-
FullObjects.contacts.Take(4)
。您还可以使用另一个包装器ObservableCollection,它只包含列表中的前四项。绑定ItemSource完全掌握在您的手中。希望你能从这里得到精华。但是当我开始服用时,它没有得到notified@Cheese-那只是个想法。您必须像我前面提到的那样创建包装器
ObservableCollection
,如果您希望通知到位,它将有四个项目。
class FullObject
{
    public string UpdateTime { get; set; }
    public List<Contact> contacts { get; set; }
    public List<Region> regions { get; set; }
}
FullObjectt = JsonConvert.DeserializeObject<FullObject>(result);
FourItems FI = new FourItems();
        for (int i = 0; i < 4; i++)
        {
            ContactCard CC = new ContactCard();
            CC.DataContext = FullObjects.contacts[i];
            if (i == 0)
            {
                FI.FirstItem.Children.Add(CC);
            }
            else if (i == 1)
            {
                FI.SecondItem.Children.Add(CC);
            }
            else if (i == 2)
            {
                FI.ThirdItem.Children.Add(CC);
            }
            else
            {
                FI.FourthItem.Children.Add(CC);
                FlipView.Items.Add(FI);
            }
        }
I will do this:

Contact new = JsonConvert.DeserializeObject<Contact>(result);
FullObjectt.contacts[0]=new;
Contact new = JsonConvert.DeserializeObject<Contact>(result);
FullObjectt.contacts[0]=new;
class FullObject : INotifyCollectionChanged 
{
    public string spTimestamp { get; set; }
    public ObservableCollection<Contact> contacts { get; set; }
    public string scTimestamp { get; set; }
    public List<Region> regions { get; set; }

}
private void Button_Click(object sender, RoutedEventArgs e)
    {
        FullObjects.contacts[0] = new Contact();
    }
ContactCard CC = new ContactCard();
CC.DataContext = FullObjects.contacts[i];
if (i == 0)
{
   FI.FirstItem.Children.Add(CC);
}
<Grid>
   <ItemsControl x:Name="ContactItems">
       <ItemsControl.ItemsPanel>
          <ItemsPanelTemplate>
              <UniformGrid Columns="2"/>
          </ItemsPanelTemplate>
       </ItemsControl.ItemsPanel>
       <ItemsControl.ItemTemplate>
           <DataTemplate>
               <local:ContactCard/> <-- Declare local namespace in XAML where 
                                        ContactCard control is declared.
           </DataTemplate>
       </ItemsControl.ItemTemplate>
   </ItemsControl>
</Grid>
FourItems FI = new FourItems();
FI.ContactItems.ItemsSource = FullObjects.contacts;
FlipView.Items.Add(FI);