Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未分配DependencyProperty_C#_Wpf_Dependency Properties - Fatal编程技术网

C# 未分配DependencyProperty

C# 未分配DependencyProperty,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我创建了一个UserControl,它公开了DependencyProperty: namespace MyApp.Sql { public partial class SqlConnectionStringBuilder { private static readonly SqlConnectionString DefaultValue = new SqlConnectionString { IntegratedSecurity = true, Pooling = false };

我创建了一个UserControl,它公开了DependencyProperty:

namespace MyApp.Sql
{
 public partial class SqlConnectionStringBuilder
 {
    private static readonly SqlConnectionString DefaultValue = new SqlConnectionString { IntegratedSecurity = true, Pooling = false };

    public static readonly DependencyProperty ConnectionStringProperty =
        DependencyProperty.Register("ConnectionString", typeof(SqlConnectionString),
                                    typeof (SqlConnectionStringBuilder),
                                    new FrameworkPropertyMetadata(
                                        DefaultValue, 
                                        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                                        ConnectionStringChanged));



    private static void ConnectionStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var builder = (SqlConnectionStringBuilder) d;
        if (e.NewValue == null)
            builder.Dispatcher.BeginInvoke((Action)(() => d.SetValue(ConnectionStringProperty, DefaultValue)));
        else
            builder.RegisterNewConnectionString((SqlConnectionString)e.NewValue);
    }

    public SqlConnectionString ConnectionString
    {
        get { return (SqlConnectionString)GetValue(ConnectionStringProperty); }
        set { SetValue(ConnectionStringProperty, value); }
    }

    private void RegisterNewConnectionString(SqlConnectionString newValue)
    {
        if (newValue != null)
            newValue.PropertyChanged += ConnectionStringPropertyChanged;
    }
    ...
  }
}
现在,我尝试在另一个UserControl中使用ConnectionString,并将TextBlock附加到ConnectionString:

但是SqlConnectionString从未分配给TextBlock。 调试ConnectionStringBuilder的SqlConnection属性时,它总是显示null


我的错在哪里?

检查一下您的绑定。我假设您正在使用SqlConnectionStringBuilder用户控件创建连接,在这种情况下,其绑定模式应该是双向的

现在,看起来您正试图绑定到主窗口后面的代码。如果将UserControl的ConnectionString绑定设置为双向,则对该依赖项属性所做的任何更改都将注入主窗口的ServerConnectionString属性。而且,因为主窗口实现了INotifyPropertyChanged,所以一旦更新了ServerConnectionString属性,TextBlock就会更新


此外,如果要绑定到主窗口,则无需在绑定中指定ElementName属性。因为您正在构造函数中设置
DataContext=this
,所以您可以在您的用户控件上说
{Binding Path=ServerConnectionString,Mode=TwoWay}

如果我使用这样的元素名:

<MyApp.Sql:SqlConnectionStringBuilder x:Name="sqlConnectionStringBuilder"  ConnectionString="{Binding ElementName=_this, Path=ServerConnectionString, Mode=TwoWay}"  />
<TextBlock Text="{Binding ElementName=sqlConnectionStringBuilder, Path=ConnectionString, StringFormat='Produced Connection String: {0}'}" Grid.Row="1" />

它起作用了


但是为什么绑定到本地实例不起作用?

您引用的“UserControl”是SqlConnectionStringBuilder,但是您发布的类是ConnectionStringBuilder,并且不继承DependencyObject,这使得DependencyProperty无效,也不继承UserControl。这是一个复制粘贴错误。。。它的名称是SqlConnectionStringBuilder,它是UserControl的一部分。仅仅因为它可能仍然是代码无法工作的原因,您的SqlConnectionStringBuilder类是否继承UserControl?
namespace MyApp
{
  public partial class SqlProvider
  {
    public SqlProvider
    {
       InitializeComponent();
       DataContext = this;
    }

    private SqlConnection _connection;
    public SqlConnection ServerConnectionString
    {
        get { return _connection; }
        set
        {
            _connection = value;
           OnPropertyChanged("ServerConnectionString");
        }
    }


    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
  }
}
<MyApp.Sql:SqlConnectionStringBuilder x:Name="sqlConnectionStringBuilder"  ConnectionString="{Binding ElementName=_this, Path=ServerConnectionString, Mode=TwoWay}"  />
<TextBlock Text="{Binding ElementName=sqlConnectionStringBuilder, Path=ConnectionString, StringFormat='Produced Connection String: {0}'}" Grid.Row="1" />