绑定到DataConmplate for ItemsControl中的自定义控件

时间:2015-01-08 06:34:17

标签: c# wpf data-binding custom-controls itemscontrol

当我想要绑定到自定义用户控件时,基于DataTemplate中定义的DataType的{​​{1}}绑定存在问题。

出于演示目的,我创建了简单的 Item class 示例,其中我收集了以下项目:

ItemsControl

在我的 ViewModel 中,我创建了这样的集合,然后公开它(有一个项目可以单独进行比较):

public class Item
{
    public string ItemNameToBeSureWhatPropertyIsBound { get; set; } 
}

我的自定义用户控件的定义如下:

public class MainWindowViewModel : INotifyPropertyChanged
{
    private ObservableCollection<Item> _items;
    private Item _exampleItem;

    public MainWindowViewModel()
    {
        Items = new ObservableCollection<Item>(new[] { new Item { ItemNameToBeSureWhatPropertyIsBound = "Me" }, new Item { ItemNameToBeSureWhatPropertyIsBound = "MySelf" }, new Item { ItemNameToBeSureWhatPropertyIsBound = "Ich" }, });
        ExampleItem = Items.LastOrDefault();
    }

    public ObservableCollection<Item> Items
    {
        get { return _items; }
        set { _items = value; OnPropertyChanged(); }
    }

    public Item ExampleItem
    {
        get { return _exampleItem; }
        set { _exampleItem = value; OnPropertyChanged();}
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

... 代码中有一个<UserControl x:Class="WpfDataTemplate.ItemRowUserControl" 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" mc:Ignorable="d" d:DesignHeight="40" d:DesignWidth="300" x:Name="ItemRowControl" DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}"> <Grid Background="Yellow" Height="40"> <TextBlock Text="{Binding ItemName}" Foreground="Black"/> </Grid> </UserControl>

DependencyProperty

问题是,当我尝试在DataTemplate中为ItemsControl绑定Item的属性时,我正在这样做 MainWindow (注意:我有虚拟转换器仅用于调试目的,返回价值回来了,仅此而已):

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

    public static readonly DependencyProperty ItemNameProperty = DependencyProperty.Register(
        "ItemName", typeof (string), typeof (ItemRowUserControl), new PropertyMetadata(default(string)));

    public string ItemName
    {
        get { return (string) GetValue(ItemNameProperty); }
        set { SetValue(ItemNameProperty, value); }
    }
}

现在,如果我绑定到我的自定义ItemRowUserControl,我进入转换器的值(我在Debug Output中看到相同的)是ItemRowUserControl本身。但是,如果我绑定到注释掉的代码,一切正常。为什么会这样,我如何对DataTemplate进行自定义控制,以便绑定(由intellisense提供)可以工作?旁注:在网格行1(在底部)绑定到我的ItemRowUserControl工作正常,所以我猜控制设置为按预期工作?

1 个答案:

答案 0 :(得分:6)

问题是您明确将UserControl的DataContext设置为自身:

DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}

删除该作业并编写ItemName绑定,如下所示:

<TextBlock Text="{Binding ItemName,
    RelativeSource={RelativeSource AncestorType=UserControl}}"/>

或者像这样

<TextBlock Text="{Binding ItemName, ElementName=ItemRowControl}"/>