加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:46:10 所属栏目:百科 来源:网络整理
导读:当我想绑定到我的自定义用户控件时,我有一个基于ItemsControl中定义的DataType的DataTemplate绑定问题. 出于演示目的,我创建了简单的Item类示例,其中我有这样的项集合: public class Item{ public string ItemNameToBeSureWhatPropertyIsBound { get; set;
当我想绑定到我的自定义用户控件时,我有一个基于ItemsControl中定义的DataType的DataTemplate绑定问题.

出于演示目的,我创建了简单的Item类示例,其中我有这样的项集合:

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

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

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:

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); }
    }
}

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

<Window.DataContext>
    <my:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
    <my:MyDummyConverter x:Key="MyDummyConverter" />
</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="50" />
    </Grid.RowDefinitions>

    <ItemsControl Name="ItemsControl" ItemsSource="{Binding Items}" Grid.Row="0" Background="Red">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type my:Item}">
                <my:ItemRowUserControl ItemName="{Binding ItemNameToBeSureWhatPropertyIsBound,Converter={StaticResource MyDummyConverter}}"  />
                <!--<Grid Background="Pink">
                    <TextBlock Text="{Binding ItemNameToBeSureWhatPropertyIsBound,Converter={StaticResource MyDummyConverter}}" Foreground="Black" Height="30" />
                </Grid>-->
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

    <Grid Grid.Row="1">
        <my:ItemRowUserControl ItemName="{Binding DataContext.ExampleItem.ItemNameToBeSureWhatPropertyIsBound,ElementName=MyWindow,Converter={StaticResource MyDummyConverter}}" />
    </Grid>
</Grid>

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

解决方法

问题是您明确将UserControl的DataContext设置为自身:
DataContext="{Binding Mode=OneWay,RelativeSource={RelativeSource Self}}

删除该赋值并编写ItemName绑定,如下所示:

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

或者像这样

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读