WPF TreeView中的TextBox不更新源代码

问题描述 投票:-1回答:1

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

我有两种类型的模板的树状视图。

  1. 具有文本块的HierarchicalDataTemplate的节点
  2. 是带有TextBlock和TextBox3的DataTemplate的叶子。

从源代码进行的绑定在所有情况下都可以正常工作,并且可以从基础类中读取Name或Name&Value属性,并且可以从后面的代码进行任何更改来进行更新。

TreeNode和TreeLeaf类均实现INotifyPropertyChanged

但是,似乎无法将TextBox.text属性绑定回TreeLeaf.Value属性(带有其吸气剂)。

XAML

<TreeView  Name="ItemsTree" Grid.Row="1"  Grid.Column="1" ItemsSource="{Binding}">
    <TreeView.Resources>
        <Color x:Key="detailMark">#FFA1A9B3</Color>
        <SolidColorBrush x:Key="detailMarkBrush" Color="{StaticResource ResourceKey=detailMark}" />
        <Style x:Key="flatTextBox" TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <Rectangle  Stroke="{StaticResource ResourceKey=detailMarkBrush}" StrokeThickness="0"/>
                            <TextBox Margin="1" Text="{TemplateBinding Text}" BorderThickness="0"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <HierarchicalDataTemplate DataType="{x:Type local:TreeNode}" ItemsSource="{Binding Children, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}">
            <TextBlock Text="{Binding Name, NotifyOnSourceUpdated=True}">
            </TextBlock>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:TreeLeaf}" >
            <StackPanel Orientation="Horizontal">
                <TextBlock Width="150" Text="{Binding Name, NotifyOnSourceUpdated=True}"/>
                <TextBox Width="150"  Text="{Binding Value, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged,  Mode=TwoWay}" Style="{StaticResource ResourceKey=flatTextBox}"/>
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

然后在后面的代码中将项目添加到树中

ItemsTree.Items.Add(treeRoot)

[TreeLeaf

Public Class TreeLeaf
Implements INotifyPropertyChanged, IEditableObject

    Private m_Key As String
    Private m_Value As String
    Private m_Parent As TreeNode

    Private temp_Item As TreeLeaf = Nothing
    Private m_Editing As Boolean = False

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Public Sub New()
        m_Key = ""
        m_Value = ""
    End Sub


    Public Sub NotifyPropertyChanged(ByVal propertyName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub

    Public Sub BeginEdit() Implements IEditableObject.BeginEdit
        If Not m_Editing Then
            temp_Item = MemberwiseClone()
            m_Editing = True
        End If
    End Sub

    Public Sub EndEdit() Implements IEditableObject.EndEdit
        If m_Editing = True Then
            temp_Item = Nothing
            m_Editing = False
        End If
    End Sub

    Public Sub CancelEdit() Implements IEditableObject.CancelEdit
        If m_Editing = True Then
            m_Key = temp_Item.m_Key
            m_Value = temp_Item.m_Value
            m_Editing = False
        End If
    End Sub

    Public Property Parent As TreeNode
        Get
            Return m_Parent
        End Get
        Set(value As TreeNode)
            m_Parent = value
            NotifyPropertyChanged("Parent")
        End Set
    End Property

    Public ReadOnly Property Name As String
        Get
            Return m_Key & " : "
        End Get
    End Property

    Public Property Key As String
        Get
            Return m_Key
        End Get
        Set(ByVal value As String)
            If Not value = m_Key Then
                m_Key = value
                NotifyPropertyChanged("Key")
            End If
        End Set
    End Property

    Public Property Value As String
        Get
            Return m_Value
        End Get
        Set(ByVal value As String)
            If Not value = m_Value Then
                m_Value = value
                NotifyPropertyChanged("Value")
            End If
        End Set
    End Property
End Class

我已经提到过设置DataContext的内容,但我不知道这将如何应用于这种情况。

wpf vb.net data-binding textbox treeview
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.