我有 ObservableCollection Fathers
,其中包含属性 ObservableCollection Sons
。我在TreeView
设置它的DataContext
属性时显示它。该Sons
属性ListBox
在每个父亲绑定到下显示为一个单选按钮ItemsSource
。
第一次将树视图的 DataContext 设置为父亲列表,一切正常。根据数据检查单选按钮。
现在,我将其设置TreeView.DataContext
为 null - 这样数据就会消失。然后回到Fathers
我第一次设置的原始 ObservableCollection。
现在由于某种原因,单选按钮停止与子对象同步。我更深入了,我看到子对象(绑定到单选按钮)中的 setter 由于某种原因被提升为 false。我猜想与绑定有关。
绑定后是否有任何缓存TreeView
或 ObservableCollection 正在保存?我希望它像我第一次设置绑定时一样工作 - 它应该像它应该只有 getter 那样被调用。
谢谢。
这是我的树视图
<UserControl x:Class="Tester.CTLMyTree"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<Border Background="#FF919191" BorderThickness="1" CornerRadius="5"
HorizontalAlignment="Left" VerticalAlignment="Top"
Padding="5" BorderBrush="Black" Height="207" Width="190">
<Border.Resources>
<sdk:HierarchicalDataTemplate x:Key="LayerListTemplate">
<StackPanel Orientation="Vertical" Width="200" >
<TextBlock Text="Hello"/>
<ListBox x:Name="lstViews" ItemsSource="{Binding Sons}" BorderThickness="0" Width="200">
<ListBox.ItemTemplate>
<DataTemplate>
<RadioButton Content="Check" IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</sdk:HierarchicalDataTemplate>
</Border.Resources>
<sdk:TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource LayerListTemplate}" x:Name="myTreeView" />
</Border>
</Grid>
</UserControl>
背后的对象
public class CCFather
{
public CCFather()
{
Sons = new ObservableCollection<CCSon>();
}
public ObservableCollection<CCSon> Sons
{
get;
set;
}
}
public class CCSon
{
private bool m_blnChecked;
public bool IsChecked
{
get
{
return m_blnChecked;
}
set
{
m_blnChecked = value;
}
}
}
在我的应用程序中,我添加了这个树视图控件并将其命名为 m_objSimpleTree。这段代码是初始化
m_objItems = new ObservableCollection<CCFather>();
CCFather objItem1 = new CCFather();
objItem1.Sons.Add(new CCSon());
objItem1.Sons[0].IsChecked = true;
m_objItems.Add(objItem1);
m_objSimpleTree.myTreeView.DataContext = m_objItems;
当我按下按钮时,我正在这样做
m_objSimpleTree.myTreeView.DataContext = null;
m_objSimpleTree.myTreeView.DataContext = m_objItems;
此代码已将儿子的 IsChecked 设置器提升为 false(为什么???)但仍将检查 RadioButton。第二次按下按钮。它将被取消选中,并且二传手没有加注。当我按下单选按钮时,它提高了二传手的两倍。第一次用假第二次用真。
不知道为什么会这样。我能想到的唯一想法是树视图在第一个绑定或类似的东西中保存了一些东西。