C# 文本框+;绑定到从不同程序集更改了InotifyProperty的属性
我在更新绑定到textbox的代码中的属性值时遇到问题(textbox没有显示新值) 它正常工作时没有任何问题,但在本例中,源类位于单独的程序集中(不知道它是否有任何区别)C# 文本框+;绑定到从不同程序集更改了InotifyProperty的属性,c#,wpf,textbox,binding,C#,Wpf,Textbox,Binding,我在更新绑定到textbox的代码中的属性值时遇到问题(textbox没有显示新值) 它正常工作时没有任何问题,但在本例中,源类位于单独的程序集中(不知道它是否有任何区别) 如果我在文本框中键入,代码中的值将更新 当我直接在代码中更改属性值时,文本框不显示新值 再次更改文本框中的值后,先前设置的值(代码中)将被覆盖(因此绑定仍在工作) 此外,我还检查了PropertyChanged事件是否被触发,以及是否在每次更改之后触发 猜猜它为什么不起作用?下面是相应的绑定和源类 TextBox Text=
我已经解决了问题,它显然没有连接到不同的程序集。我在将值设置为属性时有一个错误。我觉得它可以正常工作。唯一的区别是删除了DataContract标记并分配了DataContext。我的样本如下:
<Window x:Class="_4206499.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="360" Width="578">
<Grid>
<TextBox Text="{Binding Path=Description, Mode=TwoWay}" VerticalAlignment="Center" Margin="12,12,286,278" />
<Button Width="100" Margin="57,59,346,219" Click="Button_Click"></Button>
</Grid>
}
另一个来自单独的类库:
}
using System;
using System.ComponentModel;
namespace ClassLibrary1
{
public class Source : INotifyPropertyChanged
{
private String _Description;
public String Description
{
get { return _Description; }
set
{
if (_Description == value)
return;
_Description = value;
OnPropertyChanged("Description");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
}
您是否尝试在OnPropertyChanged中设置断点,并查看是否有任何内容附加到PropertyChanged事件?这会告诉你文本框是否被通知。我已经简化了我的问题太多,没有检查它是否仍然不起作用。我使用ICustomTypeDescriptor重定向属性,这就是为什么绑定只能以一种方式工作。这个问题也通过重定向OnPropertyChanged事件得到了解决。无论如何,谢谢你的帮助。
using System;
using System.Windows;
using ClassLibrary1;
namespace _4206499
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Source = new Source();
DataContext = Source;
}
public Source Source { get; set;} private void Button_Click(object sender, RoutedEventArgs e) { Source.Description = DateTime.Now.ToString(); } }
using System; using System.ComponentModel; namespace ClassLibrary1 { public class Source : INotifyPropertyChanged { private String _Description;
public String Description { get { return _Description; } set { if (_Description == value) return; _Description = value; OnPropertyChanged("Description"); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = this.PropertyChanged; if (handler != null) { var e = new PropertyChangedEventArgs(propertyName); handler(this, e); } } }