C# 未从UI更新WPF双向绑定
当模型更新时,UI会相应地更新,但当我更新具有双向绑定的文本框时,不会调用视图模型中的setter。我做错了什么 下面是视图模型绑定到视图的方式C# 未从UI更新WPF双向绑定,c#,wpf,C#,Wpf,当模型更新时,UI会相应地更新,但当我更新具有双向绑定的文本框时,不会调用视图模型中的setter。我做错了什么 下面是视图模型绑定到视图的方式 public partial class MyView : MetroWindow { public MyView() { try { InitializeComponent(); DataContext = new MyViewModel(new Dial
public partial class MyView : MetroWindow
{
public MyView()
{
try
{
InitializeComponent();
DataContext = new MyViewModel(new DialogService(this));
}
catch (Exception exception)
{
throw exception;
}
}
}
xaml
对于记录,即使双向绑定也不够。看起来,当您更新绑定实例中的值时,绑定实例的setter不会被调用,即使您成功地将旧值赋给了新值。您需要在声明期间设置Dependency属性的PropertyChangedCallback回调以捕获此更改
详情:
对于记录来说,即使是双向绑定也不够。看起来,当您更新绑定实例中的值时,绑定实例的setter不会被调用,即使您成功地将旧值赋给了新值。您需要在声明期间设置Dependency属性的PropertyChangedCallback回调以捕获此更改
详情:
您正在检查哪个setterSelectedEntity
或Prop1
或Prop2
?我不知道您是否注意到,但您的代码中有一个错误{Binding SelectedEntity.Prop1,>Mode=TwoWay}“-请注意“>”。同样在属性附近,我正在检查SelectedEntity,它同样有Prop1和Prop2,但是当从UI更新绑定到SelectedEntity.Prop1的文本框时,SelectedEntity的setter没有被调用。在MyViewModel中添加一个字符串属性SelectedProp1并绑定到该属性,而不是SelectedEntity.Prop1。然后调用该属性的setter。我认为实体类应该只有一个属性。@user1041481“我正在检查SelectedEntity”,这是您的问题,调用的不是“SelectedEntity”的setter,而是og“Prop1”您正在检查哪个setterSelectedEntity
或Prop1
或Prop2
?我不知道您是否注意到,但您的代码中有一个错误{Binding SelectedEntity.Prop1,>Mode=TwoWay}“-请注意“>”。同样在属性附近,我正在检查SelectedEntity,它同样有Prop1和Prop2,但是当从UI更新绑定到SelectedEntity.Prop1的文本框时,SelectedEntity的setter没有被调用。在MyViewModel中添加一个字符串属性SelectedProp1并绑定到该属性,而不是SelectedEntity.Prop1。然后调用该属性的setter。我认为实体类应该只有一个属性。@user1041481“我正在检查SelectedEntity”,这是您的问题,调用的不是“SelectedEntity”的setter,而是og“Prop1”,使用UpdateSourceTrigger=PropertyChanged可能仍然不起作用,这取决于您使用的框架以及在绑定属性的setter中执行的操作,您可能会遇到这样的问题:(解决方法:FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty=false;)因为在4.5中它们“已修复”一个bug和修复在某些方面比bug本身更糟糕…使用UpdateSourceTrigger=PropertyChanged不会help@user1041481您是否删除了“Mode=TwoWay”之前的“>”?是的,这是在我的帖子中介绍的,但不是代码的一部分。当绑定到每个文本框的字符串属性时,我将从视图绑定到viewmodel,但当绑定到类中的字符串属性时,我将无法从视图绑定到viewmodel。@user1041481嗯,我不知道会出什么问题。看起来应该能用。我建议从零开始,只需将一个文本框绑定到一个只包含字符串的viewmodel,然后从主项目中逐点添加内容,直到它停止工作,然后您就会知道问题的原因。您还可以更新您的帖子,使其包含“MyEntity”类,以便我们查看。此外,根据您使用的框架以及在绑定属性的setter中执行的操作,使用UpdateSourceTrigger=PropertyChanged可能仍然不起作用,您可能会遇到以下问题:(解决方法:FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty=false;)因为在4.5中,他们“修复”了一个bug,并且修复在某些方面比bug本身更有效……使用UpdateSourceTrigger=PropertyChanged不会help@user1041481是否删除了“Mode=TwoWay”之前的“>”?是的,这是在我的帖子中介绍的,但不是代码的一部分。当绑定到每个文本框的字符串属性时,我将从视图绑定到viewmodel,但当绑定到类中的字符串属性时,就不会了。@user1041481嗯,我不知道会出什么问题。看起来应该可以了。我建议从scratc开始只需将一个文本框绑定到只包含字符串ant的viewmodel,然后从主项目中一点一点地添加内容,直到它停止工作,然后您就会知道问题的原因。您还可以更新您的帖子以包含“MyEntity”类,以便我们可以查看它。
<TextBox x:Name="TextBox1" Grid.Column="0" Text="{Binding SelectedEntity.Prop1, >Mode=TwoWay}"
controls:TextBoxHelper.ClearTextButton="True"
controls:TextBoxHelper.IsWaitingForData="True"
controls:TextBoxHelper.UseFloatingWatermark="True"
controls:TextBoxHelper.Watermark="{x:Static >properties:Resources.Prop1}" />
<TextBox x:Name="TextBox2" Grid.Column="0" Text="{Binding SelectedEntity.Prop2}"
controls:TextBoxHelper.ClearTextButton="True"
controls:TextBoxHelper.IsWaitingForData="True"
controls:TextBoxHelper.UseFloatingWatermark="True"
controls:TextBoxHelper.Watermark="{x:Static >properties:Resources.Prop2}"/>
public class MyViewModel : IMyViewModel, INotifyPropertyChanged
{
private readonly IDialogService _dialogService;
public event PropertyChangedEventHandler PropertyChanged;
private readonly MyModel _model;
private MyEntity _selectedEntity;
public MyViewModel(IDialogService dialogService)
{
_dialogService = dialogService;
_selectedEntity = new MyEntity();
_model = new MyModel();
_model.PropertyChanged += _model_PropertyChanged;
}
public MyEntity SelectedEntity
{
get
{
var information = _model.GetInformation();
_selectedEntity.Flight = information.Prop1;
information.Destination = information.Prop2;
return _selectedEntity;
}
set
{
_selectedEntity = value;
OnPropertyChanged("SelectedEntity");
}
}
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
<TextBox x:Name="TextBox1" Grid.Column="0" Text="{Binding SelectedEntity.Prop1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"