在過去的幾個星期裏,我一直試圖讓我的TreeView工作的EditableTextBlock(從codeproject)。EditableTextBlock - TreeView - 虛擬化
該控件的屬性IsInEditMode
設置爲true時將其更改爲TextBox
。
的TreeView
是虛擬化,並聲明如下:
<TreeView x:Name="treeEnvironment"
Margin="0,29,0,0" BorderThickness="0"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
</TreeView>
的TreeView
使用ItemsSource
屬性來獲取它的數據並在此值始終是類的一個實例(可以稱之爲A
)。這個類包含另一種類型的實例列表(我們稱之爲B
)。最後一個類包含另一個類的實例列表(我們稱之爲「C」)。這是怎麼看起來像在代碼:
class A
{
public String Name;
public ObservableCollection<B> Items;
}
class B
{
public String Name;
public ObservableCollection<C> Items;
}
class C
{
public String Name;
public bool IsRenaming;
}
對於這三個班的存在MainWindow.Resources
定義如下的HierarchicalDataTemplate
:
<DataTemplate DataType="{x:Type C}">
<StackPanel Orientation="Horizontal">
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Rename" Click="C_Rename_Click" />
</ContextMenu>
</StackPanel.ContextMenu>
<v:EditableTextBlock Text="{Binding Path=Name}" IsInEditMode="{Binding Path=IsRenaming, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type B}" ItemsSource="{Binding Path=Items, Mode=OneWay}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Name}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type A}" ItemsSource="{Binding Path=Items, Mode=OneWay}">
<StackPanel Orientation="Horizontal">
<Image Source="icons/icon_A.png" Width="16" Height="16" />
<TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Name}" />
</StackPanel>
</HierarchicalDataTemplate>
的DataTemplate
都沒有鑰匙,使其自動應用。
點擊C
的上下文菜單中的重命名MenuItem
時,則觸發事件,定義如下:
private void C_Rename_Click(object sender, RoutedEventArgs e)
{
C instance = (sender as FrameworkElement).DataContext as C;
if (instance != null) {
instance.IsRenaming = true;
} else {
MessageBox.Show("DEBUG: C_Rename_Click(" + sender.ToString() + ", " + e.ToString() + ") : instance == null");
}
}
的問題是,EditableTextBlock
不會變成一個TextBox
當IsRenaming
財產在選擇要重命名的實例C
上設置爲true。
EditableTextBlock
工作得很好,當我把它作爲一個正常的控制。
我的猜測是它與虛擬化有關。任何幫助,將不勝感激。
謝謝你的時間,最好的問候,
100GPing100。
謝謝,這有助於很多,不僅有這個問題,而且讓我更好地理解MVVM。欣賞它:D – zeluisping