绑定到自定义的依赖项属性 - 再次 [英] Binding to custom dependency property - again

查看:157
本文介绍了绑定到自定义的依赖项属性 - 再次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

OK,我知道。这已被要求从字面上100万次,但我仍然不明白这一点。对不起这一点。

OK, i know. This has been asked literally one million times, but i still don't get it. Sorry for that.

任务:不断实现最简单的依赖项属性,它可以在XAML中使用这样的:

The task: implement the simplest Dependency Property ever, which can be used in xaml like that:

<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>

我认为,<一个href=\"http://stackoverflow.com/questions/5698865/simple-dependency-property-and-usercontrol-issues-in-c-sharp\">this答案是相当接近。为了更好的可读性,我复制所有我的code这里(主要来自上面的答案)。

I think that this answer is quite close. For better readability i copy all my code here (mostly from that answer above).

<UserControl x:Class="Test.UserControls.MyUserControl1"
             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" 
             DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <!-- Text is being bound to outward representative property;
             Note the DataContext of the UserControl -->
        <TextBox Text="{Binding MyTextProperty}"/>
    </Grid>
</UserControl>

public partial class MyUserControl1 : UserControl
{
    // The dependency property which will be accessible on the UserControl
    public static readonly DependencyProperty MyTextPropertyProperty =
        DependencyProperty.Register("MyTextProperty", typeof(string), typeof(MyUserControl1), new UIPropertyMetadata(String.Empty));
    public string MyTextProperty
    {
        get { return (string)GetValue(MyTextPropertyProperty); }
        set { SetValue(MyTextPropertyProperty, value); }
    }

    public MyUserControl1()
    {
        InitializeComponent();
    }
}

这是我的MainWindow.xaml

And this is my MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:uc="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Vertical">
        <uc:MyUserControl1 MyTextProperty="my text goes here"/>
        <Button Click="ButtonBase_OnClick" Content="click"/>
    </StackPanel>
</Window>

到目前为止,一切正常。不过,我觉得这很不是有用。什么我需要为

So far, everything works. However, i find this quite not usefull. What i'd need is

<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>

和能够通过设置来改变这个的DataContext (像通常那样在MVVM)

and being able to change this by setting a DataContext (as you usually do in MVVM)

所以我代替线以上,并添加我的code背后如下:

So i replace the line as above and add my code behind as follows:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        Text = "Initial Text";
        DataContext = this;
    }
    private string _Text;
    public string Text
    {
        get { return _Text; }
        set
        {
            if (value != _Text)
            {
                _Text = value;
                NotifyPropertyChanged("Text");
            }
        }
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        Text = "clicked";
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

无论是最初的文本,也不是点击显示...永远。所以我的问题是如何实现一个部门。正确财产与使用

Neither the "initial Text" nor the "clicked" is displayed... ever. So my question is how to implement a dept. property correctly to be used with

<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>

?感谢您帮助我。

? Thanks for helping me out.

推荐答案

文本物业位于的DataContext 中的主窗口的不是用户控件。

The Text property is located on the DataContext of the MainWindow not of the UserControl.

因此​​,改变这一行&LT; UC:MyUserControl1 MyTextProperty ={结合文字}/&GT; 这个:

So change this line <uc:MyUserControl1 MyTextProperty="{Binding Text}"/> into this:

<uc:MyUserControl1 MyTextProperty="{Binding Text, ElementName=MyMainWindow}"/>

这将告诉绑定,你在谈论位于文本元素在你的主窗口。当然,由于在这个例子中我使用的ElementName ,你要去想的名称的你的窗口MyMainWindow ...

Which will tell the Binding that you're talking about the Text element located in you MainWindow. Of course, since in this example I used ElementName, you're going to want to name your window MyMainWindow...

所以添加到您的主窗口:

So add this to your MainWindow:

<Window  Name="MyMainWindow" ..... />

如果你不想命名窗口,您可以使用的RelativeSource FindAncestor这样的绑定:

If you rather not name your window, you can use the RelativeSource FindAncestor binding like this:

<wpfApplication6:MyUserControl1 MyTextProperty="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>

在这两种方法,你问到找到名为文本属性窗口的DataContext的。

In both ways, you are asking to find the property named 'Text' in the DataContext of the window.

这篇关于绑定到自定义的依赖项属性 - 再次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆