首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >自定义控件依赖项属性绑定

自定义控件依赖项属性绑定
EN

Stack Overflow用户
提问于 2012-08-10 14:37:16
回答 1查看 21.3K关注 0票数 22

即使是最基本的例子,我也想让它正常工作,这简直要疯了。我无论如何也不能让绑定起作用。这里有一个超级简单的例子,它对我来说不起作用。我一定是做错了什么。

我的控件库程序集中的自定义控件:

代码语言:javascript
复制
public class TestControl : Control
{
    public static readonly DependencyProperty TestPropProperty =
        DependencyProperty.Register("TestProp", typeof(string), typeof(TestControl), new UIPropertyMetadata(null));

    public string TestProp
    {
        get { return (string)GetValue(TestPropProperty); }
        set { SetValue(TestPropProperty, value); }
    }

    static TestControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(TestControl), new FrameworkPropertyMetadata(typeof(TestControl)));
    }
}

及其XAML模板:

代码语言:javascript
复制
<Style TargetType="{x:Type local:TestControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:TestControl}">
                <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel>
                        <TextBlock Text="Testing..." />
                        <Label Content="{Binding TestProp}" Padding="10" />
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

下面是在wpf窗口中使用控件的XAML,它引用了我的控件库:

代码语言:javascript
复制
<Grid>
    <ItemsControl Name="mylist">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <my:TestControl TestProp="{Binding Path=Name}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

下面是后面的代码:

代码语言:javascript
复制
public partial class Test2 : Window
{
    public class TestObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }

        private int _id;
        public int id
        {
            get { return _id; }
            set { _id = value; OnPropertyChanged("id"); }
        }

        private string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name = value; OnPropertyChanged("Name"); }
        }
    }

    public Test2()
    {
        InitializeComponent();

        mylist.ItemsSource = new TestObject[]
        {
            new TestObject(){ id = 1, Name = "Tedd" },
            new TestObject(){ id = 2, Name = "Fred" },
            new TestObject(){ id = 3, Name = "Jim" },
            new TestObject(){ id = 4, Name = "Jack" },
        };
    }
}

运行此示例将给出该控件的四个实例,但我只看到"Testing...“每个都有TextBlock。我的标签永远不会被绑定。我误解和做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-10 14:45:57

您尚未设置正确的绑定源。您要么必须设置RelativeSource

代码语言:javascript
复制
<Label Content="{Binding TestProp, RelativeSource={RelativeSource Mode=TemplatedParent}}" />

或者使用TemplateBinding

代码语言:javascript
复制
<Label Content="{TemplateBinding TestProp}"/>
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11896619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档