WPF树视图中的文本框未更新源

WPF树视图中的文本框未更新源,wpf,vb.net,data-binding,textbox,treeview,Wpf,Vb.net,Data Binding,Textbox,Treeview,我不知道我是否根本不理解这里的某些事情,或者只是做了一些愚蠢的事情 我有一个带有两种模板的树视图 具有文本块的HierarchycalDataTemplate的节点 具有TextBlock和TextBox3的DataTemplate的叶子。 源代码的绑定在所有情况下都可以正常工作,从底层类读取Name或Name&Value属性,并根据代码背后的任何更改进行更新 TreeNode和TreeLeaf类都实现INotifyPropertyChanged 但是,将TextBox.text属性与其gett

我不知道我是否根本不理解这里的某些事情,或者只是做了一些愚蠢的事情

我有一个带有两种模板的树视图

具有文本块的HierarchycalDataTemplate的节点 具有TextBlock和TextBox3的DataTemplate的叶子。 源代码的绑定在所有情况下都可以正常工作,从底层类读取Name或Name&Value属性,并根据代码背后的任何更改进行更新

TreeNode和TreeLeaf类都实现INotifyPropertyChanged

但是,将TextBox.text属性与其getter绑定回TreeLeaf.Value属性似乎不起作用

XAML

TreeLeaf类


我看到有人提到设置DataContext,但我不明白这将如何应用于这种情况。

无法从代码中判断绑定是否有效,因为ViewModel代码足够复杂,而且还取决于treeview ViewModel代码等

调试这些类型问题的一种方法是创建一个转换器,并使其成为应该调试的绑定的一部分。在转换器内设置断点将显示在源或目标中的值发生更改时是否按预期调用绑定。转换器的代码非常简单:

Imports System
Imports System.Globalization
Imports System.Windows.Data

Namespace MyApp.Converters
    Public Class DebugConverter
        Inherits IValueConverter

        Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object
            Return value
        End Function

        Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object
            Return value
        End Function
    End Class
End Namespace
它与有问题的绑定的集成也很简单。通过其名称空间(例如MyApp.Converters)将其添加到XAML中:

xmlns:conv="clr-namespace:MyApp.Converters"
…并通过TreeView代码列表的Resource部分中的以下语句创建实例:

<conv:DebugConverter x:Key="DebugConverter"/>
…最后但并非最不重要的是,将转换器集成到要调试的绑定中:

<TextBox
Width="150"
Style="{StaticResource ResourceKey=flatTextBox}"
Text="{Binding Value, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter={StaticResource DebugConverter}}" />
现在,当您在Convert和ConvertBack方法中设置断点时,您应该会看到在启动应用程序时调用这些方法。如果在两个方向上都看不到,则知道绑定不起作用或值未更新,然后可以进一步搜索原因


希望这能有所帮助。

嗯,不幸的是,我找到了答案

文本框的样式模板正在覆盖绑定

带有TemplateBinding的行似乎默认为源代码的单向

<TextBox Margin="1" Text="{TemplateBinding Text}" BorderThickness="0"/>
如果你也改变它,它现在就可以工作了

<TextBox Margin="1" Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" BorderThickness="0"/>

谢谢你的意见。不幸的是,它没有让我走得更远。我可以看到在显示文本框时调用了Convert函数,或者我在代码后面的其他地方更新了值。但从不调用convert back,也不会更改属性或失去焦点。出于所有意图和目的,我假设这是一个单向绑定,除了显式声明双向绑定之外。
<TextBox
Width="150"
Style="{StaticResource ResourceKey=flatTextBox}"
Text="{Binding Value, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter={StaticResource DebugConverter}}" />
<TextBox Margin="1" Text="{TemplateBinding Text}" BorderThickness="0"/>
<TextBox Margin="1" Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" BorderThickness="0"/>