在ListBox中绑定Usercontrol的DependencyProperty

本文关键字:DependencyProperty Usercontrol 绑定 ListBox | 更新日期: 2023-09-27 18:02:00

我需要ListBox与我的UserControl在其中列出。我的UserControl有TextBox。我想在UserControl的文本框中显示List的子项的属性。我已经尝试了很多选项与DataContext和ElementName -它只是不工作。我只是粘在上面。使其工作的唯一方法是删除UserControl本身的DataContext绑定,并更改项目属性名称,使其与DependencyProperty名称相匹配-但我需要在不同的视图模型中使用不同的实体来重用我的控件,因此几乎不可能使用该方法。

有趣的事情是,如果我改变我的UserControl Textbox和绑定它的文本属性-一切工作。文本框和我的UserControl有什么区别?

我来展示一下我的代码。我已经简化了代码,只显示必要的:

控制XAML:

<UserControl x:Class="TestControl.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" 
         mc:Ignorable="d" 
         d:DesignHeight="100" d:DesignWidth="200"
         DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <TextBlock Text="{Binding Text}"/>
    </Grid>
</UserControl>

控制CS:

    public partial class MyControl : UserControl
    {
        public MyControl()
        {
            InitializeComponent();
        } 
        public string Text
        {
            get { 
                return (string)this.GetValue(TextProperty); }
            set { 
                this.SetValue(TextProperty, value); }
        }
        public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyControl), new propertyMetadata(""));
}

窗口XAML:

<Window x:Class="TestControl.MainWindow"
        Name="_windows"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestControl"
        Title="MainWindow" Height="350" Width="525" >
    <Grid Name="RootGrid">
        <ListBox ItemsSource="{Binding ElementName=_windows, Path=MyList}">
            <ItemsControl.ItemTemplate >
                <DataTemplate >
                    <local:MyControl Text="{Binding Path=Name}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

窗口CS:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            _list = new ObservableCollection<Item>();
            _list.Add(new Item("Sam"));
            _list.Add(new Item("App"));
            _list.Add(new Item("H**"));
            InitializeComponent();
        }
        private ObservableCollection<Item> _list;
        public ObservableCollection<Item> MyList
        {
            get { return _list;}
            set {}
        }
    }
    public class Item
    {
        public Item(string name)
        {
            _name = name;
        }
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

在ListBox中绑定Usercontrol的DependencyProperty

这是XAML中一个相当大的问题。问题是,当您在用户控件

中这样做时:
DataContext="{Binding RelativeSource={RelativeSource Self}}"

更改其数据上下文,以便在这一行中:

<local:MyControl Text="{Binding Path=Name}"/>

运行时现在将尝试在"MyControl"实例上解析"Name",而不是在继承的数据上下文(即视图模型)上。(通过检查Output窗口来确认这一点——您应该会看到一个绑定错误。)

您可以通过使用RelativeSource绑定来解决这个问题,而不是这样设置用户控件的数据上下文:
<UserControl x:Class="TestControl.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" 
         mc:Ignorable="d" 
         d:DesignHeight="100" d:DesignWidth="200"
    <Grid>
        <TextBlock 
            Text="{Binding Text,RelativeSource={RelativeSource AncestorType=UserControl}}"
        />
    </Grid>
</UserControl>
相关文章:
  • 没有找到相关文章