从XAML绑定到自定义依赖属性



我已经实现了一个自定义DependencyProperty,并希望从XAML绑定到它。由于某些原因,当绑定源(MainWindow.Test)更新时,它不会更新。绑定源不是DP,但会触发PropertyChanged事件。但是,此更新适用于非自定义依赖项属性

作品

:

<TextBlock Text="{Binding Test}" />

不工作:

<local:DpTest Text="{Binding Test}"/>

任何想法?


下面是DP实现:

using System;
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication3
{
public partial class DpTest : UserControl
{
    public DpTest()
    {
        DataContext = this;
        InitializeComponent();
    }
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(DpTest), new PropertyMetadata(string.Empty, textChangedCallBack));
    static void textChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args)
    {
        int x = 5;
    }
}
}

的用法如下:

<Window x:Class="WpfApplication3.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:local="clr-namespace:WpfApplication3" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <TextBlock Text="{Binding Test}"></TextBlock>
    <local:DpTest Text="{Binding Test}"></local:DpTest>
    <Button Click="Button_Click">Update</Button>
</StackPanel></Window>

绑定后的代码:

using System;
using System.Collections.Generic;
using System.Windows;
using System.ComponentModel;
namespace WpfApplication3
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        DataContext = this;
        InitializeComponent();
    }
    string _test;
    public string Test
    {
        get { return _test; }
        set
        {
            _test = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Test"));
            }
        }
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Test = "Updatet Text";
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
}

Do not set DataContext = this; on UserControls,这样,如果您假设DataContext被继承,那么实例上的所有绑定都将失败,因为这会停止它并且是相当不可见的。在UserControl绑定中,您应该为控件命名并执行ElementName绑定,或者使用RelativeSource

<UserControl Name="control" ...>
     <TextBlock Text="{Binding Text, ElementName=control}"/>
<UserControl ...>
     <TextBlock Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}}"/>

给你的窗口一个名字,并把你的绑定改成如下:(否则使用UserControl的数据上下文,这不是您想要的)

...
x:Name="mainWindow">
        <Grid>
        <StackPanel>
          <TextBlock Height="20" Background="Yellow" Text="{Binding Test}"></TextBlock>
          <local:DpTest Text="{Binding Path=Test, ElementName=mainWindow, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></local:DpTest>
          <Button Click="Button_Click">Update</Button>

如果你还没有在你的UserControl中绑定,那么按下面的方式绑定:

<TextBlock Text="{Binding ElementName=dpTest, Path=Text,
Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBlock>

this works for me.

HTH

相关内容

  • 没有找到相关文章

最新更新