C# 未从UI更新WPF双向绑定

C# 未从UI更新WPF双向绑定,c#,wpf,C#,Wpf,当模型更新时,UI会相应地更新,但当我更新具有双向绑定的文本框时,不会调用视图模型中的setter。我做错了什么 下面是视图模型绑定到视图的方式 public partial class MyView : MetroWindow { public MyView() { try { InitializeComponent(); DataContext = new MyViewModel(new Dial

当模型更新时,UI会相应地更新,但当我更新具有双向绑定的文本框时,不会调用视图模型中的setter。我做错了什么

下面是视图模型绑定到视图的方式

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回调以捕获此更改

详情:

您正在检查哪个setter
SelectedEntity
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”您正在检查哪个setter
SelectedEntity
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}"