如何将List传递给WPF用户控件中的listview

31moq8wy  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(238)

我试图填补一个列表视图包含在一个用户控件,但我遇到了一个路障,不知道如何继续。

<UserControl x:Class="AC_Career_Mode.controls.HistoryTab"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:AC_Career_Mode.controls"
             mc:Ignorable="d" 
             x:Name="RecordsUC"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <ListView x:Name="RecordsCtrl_lv" SelectionMode="Single" Grid.Row="1" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="100" DisplayMemberBinding="{Binding Date, StringFormat=dd-MM-yyyy}">
                        <GridViewColumnHeader Content="Date" />
                    </GridViewColumn>

                    <GridViewColumn Width="600" DisplayMemberBinding="{Binding Description}">
                        <GridViewColumnHeader Content="Description"/>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        <Label Content="{Binding Title}" HorizontalAlignment="Left" Width="403" />
    </Grid>
</UserControl>

我的代码后面

public partial class HistoryTab : UserControl
    {
        public ObservableCollection<Record> Records 
        { 
            get { return (ObservableCollection<Record>)GetValue(RecordsProperty); }
            set { SetValue(RecordsProperty, value); }
        }

        public static readonly DependencyProperty RecordsProperty = DependencyProperty.Register("Records", typeof(ObservableCollection<Record>),
                                                                                                            typeof(HistoryTab),
                                                                                                            new PropertyMetadata(null));

        public string Title { get; set; }

        public HistoryTab()
        {
            InitializeComponent();
            DataContext = this;
        }

    }

那么我就像这样调用uc

<uControl:HistoryTab x:Name="test_records" />

然后像这样设置records属性

test_records.Records = new ObservableCollection<Record>(Record.DeserializeRecords(profile));

现在我不知道还有什么我必须做的,我已经谷歌和咨询了许多来源,但要么是超出了我的理解,给什么做或太基本的细节
我访问的一些链接
Passing Generic lists to WPF usercontrol(我不知道答案想让我做什么)
This youtube tutorial(很好,但偏离了我想做的事情)

cxfofazt

cxfofazt1#

与往常一样,当您要将数据传递给控件时,请使用数据绑定。
我推荐阅读Data binding overview (WPF .NET)来快速了解数据绑定。
您也不应该将自定义控件的DataContextUserControl设置为自身。这消除了在控件的属性上设置绑定的机会。根本不要设置DataContext。它将被继承或在控件使用的上下文中显式设置。这允许以下用法:

<!-- The HistoryTab.DataContext is implicitly inherited -->
<HistoryTab x:Name="test_records"
            Records="{Binding RecordItems}" />

DataContext = this;仅在WPF根元素中可接受,例如WindowPagePopup。因为根据定义,这些元素不能有父元素(在可视树中),所以不会有与父数据相关的上下文。
首先修复控件的DataContext

HistoryTab.xaml.cs

partial class HistoryTab : UserControl
{
  public HistoryTab()
  {
    InitializeComponent();
  }
}

然后将内部ListView绑定到父对象的Record属性:

<UserControl>
  <ListView x:Name="RecordsCtrl_lv" 
            ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=Records}" />
</UserControl>

相关问题