C# 简单文本框文本绑定失败WPF

C# 简单文本框文本绑定失败WPF,c#,wpf,xaml,silverlight,binding,C#,Wpf,Xaml,Silverlight,Binding,我们正在将一个应用程序从Silverlight转换为WPF。这是一个相当复杂的应用程序,但代码共享大约为95%+。除了XML名称空间定义等,XAML几乎都是一样的。现在大约90%的应用程序都能正常工作,但有几个突出的问题让我感到困惑。一个是约束性问题 我们有一个名为TaskInfo的模型对象。它有一个名为TaskNo的属性。在Silverlight和WPF中,我们像这样绑定到这个属性 <TextBox IsReadOnly="True" Grid.Column="0" Grid.Row=

我们正在将一个应用程序从Silverlight转换为WPF。这是一个相当复杂的应用程序,但代码共享大约为95%+。除了XML名称空间定义等,XAML几乎都是一样的。现在大约90%的应用程序都能正常工作,但有几个突出的问题让我感到困惑。一个是约束性问题

我们有一个名为TaskInfo的模型对象。它有一个名为TaskNo的属性。在Silverlight和WPF中,我们像这样绑定到这个属性

<TextBox IsReadOnly="True" Grid.Column="0"  Grid.Row="0" Margin="1" Text="{Binding Path=TaskNo}" Height="28"  Background="#CAECF4" VerticalAlignment="Center" VerticalContentAlignment="Center"  />
为了进一步调试这个问题,我在文本框中为GotFocus事件添加了这个事件处理程序。因此,在将任务保存到服务器端并返回并设置为DataContext之后,我在控件内部单击以触发此事件处理程序。当我逐步阅读这段代码时,我可以看到DataContext是正确的,并且具有正确的TaskNo。调用此代码仍然不会导致绑定发生

    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        var textBox = (TextBox)sender;
        var be = textBox.GetBindingExpression(TextBox.TextProperty);
        be.UpdateSource();
        be.UpdateTarget();
    }
文本框文本绑定属性:

TextBox属性的DataContext:


我如何理解这个绑定错误?Silverlight和WPF之间的绑定问题是什么?我需要一些解决方法吗?为什么绑定不起作用?

如果根据Equals方法,以前的DataContext与新的DataContext等价,则WPF中的绑定不会更新。

Silverlight和WPF之间的区别在于,当DataContext更改时,WPF似乎使用Equals方法来计算对象之间的差异,而Silverlight使用引用。这意味着WPF与Xamarin.Forms相同

我尝试了这段代码,它使TaskNo正确显示。我认为发生的情况是,当调用Equals时,前面的DataContext与新的DataContext是等价的。所以,这解决了这个问题

    private async void TaskPageHeader_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        TaskNoBox.DataContext = new object();
        TaskNoBox.DataContext = CurrentTask;
    }

如果根据Equals方法,以前的DataContext与新的DataContext等价,则WPF中的绑定永远不会更新。

Silverlight和WPF之间的区别在于,当DataContext更改时,WPF似乎使用Equals方法来计算对象之间的差异,而Silverlight使用引用。这意味着WPF与Xamarin.Forms相同

我尝试了这段代码,它使TaskNo正确显示。我认为发生的情况是,当调用Equals时,前面的DataContext与新的DataContext是等价的。所以,这解决了这个问题

    private async void TaskPageHeader_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        TaskNoBox.DataContext = new object();
        TaskNoBox.DataContext = CurrentTask;
    }

这适用于WPF中的所有依赖项属性。如果再次指定相同的值,则不会触发属性更改操作。是。听起来不错。不同之处在于,在Silverlight中,等价性由对象引用确定,而在Xamarin.Forms和WPF中,等价性由Equals方法确定。这适用于WPF中的所有依赖属性。如果再次指定相同的值,则不会触发属性更改操作。是。听起来不错。不同之处在于,在Silverlight中,等价性是由对象引用确定的,而在Xamarin.Forms和WPF中,等价性是由Equals方法确定的。