Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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#WPF绑定未更新_C#_Wpf_Xaml_Dependency Properties - Fatal编程技术网

C#WPF绑定未更新

C#WPF绑定未更新,c#,wpf,xaml,dependency-properties,C#,Wpf,Xaml,Dependency Properties,我正在尝试创建一个自定义控件,可以在其中绑定一个属性,就像TextBox有Text属性和大量其他控件一样 问题是,当我从MainWindow绑定属性时,该属性不会更新 我浏览了好几页,尝试了很多选择,但都没有成功。最后,我终于找到了一个可行的解决方案,其中包括更改控件的DataContext: ((FrameworkElement) this.Content).DataContext = this; 在我使用this.DataContext=this之前,控件内的所有值都已更新,但其他值均未更

我正在尝试创建一个自定义控件,可以在其中绑定一个属性,就像TextBox有Text属性和大量其他控件一样

问题是,当我从MainWindow绑定属性时,该属性不会更新

我浏览了好几页,尝试了很多选择,但都没有成功。最后,我终于找到了一个可行的解决方案,其中包括更改控件的DataContext:

((FrameworkElement) this.Content).DataContext = this;
在我使用
this.DataContext=this
之前,控件内的所有值都已更新,但其他值均未更新

问题: (对我来说)找到的解决方案看起来像是一些丑陋的变通办法

  • 这是正确的方法,还是有更好的“正确”方法
  • 如果有更好的方法,我能举个例子吗
  • 另外,为什么找到的解决方案有效
  • 演示解决方案 我创建了一个快速演示解决方案(你可以得到它)。ExampleControl是具有MyValue属性的自定义控件。绑定在主窗口中完成。单击“测试打印”按钮时,它应打印上面文本框的值(MyValue prop的值)。目前,包含了找到的解决方案(ExampleControl.xaml.cs,第34行),所以它应该已经可以工作了

    相关代码 主窗口

    //XAML
    //什么地方有房产
    公共字符串SomeProperty{get;set;}
    
    示例控件

    //XAML
    打印文本!
    //相关代码
    公共静态只读从属属性MyValueProperty=
    DependencyProperty.RegisterAttached(“MyValue”、typeof(字符串)、typeof(ExampleControl)、new FrameworkPropertyMetadata
    {
    BindsTwoWayByDefault=true,
    DefaultUpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged
    });
    公共字符串MyValue
    {
    获取{返回GetValue(MyValueProperty)作为字符串;}
    set{SetValue(MyValueProperty,value);}
    }
    //在构造函数中,使其工作。
    ((FrameworkElement)this.Content).DataContext=this;
    

    谢谢

    由于您提供的信息太少,代码会很好,我有一些注释要给您

    • 在源上使用INotifyPropertyChanged接口进行绑定。-您必须提高PropertyChanged才能使绑定工作
    • 创建新的CustomControl时,请确保控件的属性是DependendyProperties

    由于您提供的信息太少,代码会很好,我有一些注释给您

    • 在源上使用INotifyPropertyChanged接口进行绑定。-您必须提高PropertyChanged才能使绑定工作
    • 创建新的CustomControl时,请确保控件的属性是DependendyProperties

    搜索MVVM和数据绑定教程如果您仅使用文本框及其绑定的一个示例来包含该自定义控件的实际XAML,将会有所帮助。致以最诚挚的问候,@Alex,我添加了解决方案,但我将用一些内联代码更新问题。@AlexBell,我添加了代码的相关部分。如果我理解正确,此解决方案将使用该行(//在构造函数中,使其工作。((FrameworkElement)this.Content.DataContext=this;)。那么,您希望我们修改您的代码,使其在没有该行的情况下工作吗?请澄清,因为你的问题似乎过于宽泛。最好的方面是,搜索MVVM和数据绑定教程如果您只使用一个文本框及其绑定示例来包含该自定义控件的实际XAML,这将有所帮助。致以最诚挚的问候,@Alex,我添加了解决方案,但我将用一些内联代码更新问题。@AlexBell,我添加了代码的相关部分。如果我理解正确,此解决方案将使用该行(//在构造函数中,使其工作。((FrameworkElement)this.Content.DataContext=this;)。那么,您希望我们修改您的代码,使其在没有该行的情况下工作吗?请澄清,因为你的问题似乎过于宽泛。最好的方面是,我尝试了INotifyPropertyChanged,但是PropertyChanged属性总是空的,这看起来很奇怪。对于第二点,我使用DependencyProperty。谢谢PropertyChanged属性始终为空是什么意思?INotifyPropertyChanged具有PropertyChangedEventHandler PropertyChanged。调用OnPropertyChanged方法时,该属性值为null,因此永远不会调用调用。我将对此进行研究,因为此事件是WPF中绑定工作的原因。我尝试了INotifyPropertyChanged,但PropertyChanged属性始终为null,这似乎很奇怪。对于第二点,我使用DependencyProperty。谢谢PropertyChanged属性始终为空是什么意思?INotifyPropertyChanged具有PropertyChangedEventHandler PropertyChanged。当调用OnPropertyChanged方法时,该属性值为null,因此从不调用调用。我将对此进行研究,因为此事件使WPF中的绑定工作。
    // XAML
    <local:ExampleControl MyValue="{Binding SomeProperty}"></local:ExampleControl>
    
    // Where SomeProperty 
    public string SomeProperty { get; set; }
    
    // XAML
    <TextBox Grid.Column="0" Text="{Binding MyValue}"></TextBox>
    <Button Grid.Column="1" Click="Button_Click">Print Text!</Button>
    
    // Relevant code
     public static readonly DependencyProperty MyValueProperty = 
            DependencyProperty.RegisterAttached("MyValue", typeof(string), typeof(ExampleControl), new FrameworkPropertyMetadata
        {
            BindsTwoWayByDefault = true,
            DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        });
    
    public string MyValue
    {
        get { return GetValue(MyValueProperty) as string; }
        set { SetValue(MyValueProperty, value); }
    }
    
    // In constructor, to make it work.
    ((FrameworkElement) this.Content).DataContext = this;