在usercontrol中公开控件的itemsource属性

时间:2018-05-28 12:14:09

标签: c# wpf listview mvvm binding

我有一个包含一些按钮和ListView的用户控件。

我希望我的自定义控件具有ItemsSource属性,该属性直接绑定到listviews itemsource。

MyControl.xaml.cs

public partial class MyControl : UserControl
{

    public static DependencyProperty ItemsSourceProperty =
              ListView.ItemsSourceProperty.AddOwner(typeof(AddFilesControl));

    public ObservableCollection<DocumentFile> ItemsSource
    {
        get { return (ObservableCollection<DocumentFile>)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }
}

MyControl.xaml

<UserControl x:Class="[...].MyControls.MyControl"
             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">
    <Grid>
        <ListView>
           <ListView.ItemTemplate>
              [...]
           </ListView.ItemTemplate>
        </ListView>
    </Grid>
</UserControl>

MyViewModel.cs (设为MyWindow的数据源仅包含MyControl

public class MyViewModel : INotifyPropertyChanged
{
    public ObservableCollection<DocumentFile> DefaultList { get; set; }
}

调试时不显示任何项目,但ViewModel中有项目。

绑定似乎是正确的。

<custom:MyControl ItemsSource="{Binding DefaultList}" />

这里有什么问题?

1 个答案:

答案 0 :(得分:2)

作为MyControl一部分的ListView元素未连接到MyControl.ItemsSource

可以通过创建绑定来修复:

<UserControl x:Class="[...].MyControls.MyControl"
             x:name="myControl"
             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">
    <Grid>
        <ListView ItemsSource="{Binding ItemsSource, ElementName=myControl}">

        </ListView>
    </Grid>
</UserControl>

DP.AddOwner()方法无法创建绑定。 ItemsSourceProperty DP由ItemsControl类声明。 AddOwner无法了解MyControl中的ListView。它如何将它们绑在一起?