问候!
我在我的项目中遇到了这个问题(带有C#的Silverlight 3):
我有一个TreeView,它是绑定到树的数据。 此TreeView在资源字典中有一个HierarchicalDataTamplate,用于定义各种控件。现在我想隐藏(Visibility.Collapse)一些项目,具体取决于节点是否有子节点。其他项目应在相同条件下可见。
当我第一次将源树绑定到TreeView时,它就像魅力一样,但是当我更改源树时,树视图中的可见性不会改变。
XAML - 页面:
<controls:TreeView x:Name="SankeyTreeView"
ItemContainerStyle="{StaticResource expandedTreeViewItemStyle}"
ItemTemplate="{StaticResource SankeyTreeTemplate}">
<controls:TreeViewItem IsExpanded="True">
<controls:TreeViewItem.HeaderTemplate>
<DataTemplate>
<TextBlock Text="This is just for loading and will be replaced directly after the data becomes available..."/>
</DataTemplate>
</controls:TreeViewItem.HeaderTemplate>
</controls:TreeViewItem>
</controls:TreeView>
XAML - ResourceDictionary
<!-- Each node in the tree is structurally identical, hence only one Hierarchical
Data Template that'll use itself on the children. -->
<Data:HierarchicalDataTemplate x:Key="SankeyTreeTemplate"
ItemsSource="{Binding Children}">
<Grid Height="24">
<TextBlock x:Name="TextBlockName" Text="{Binding Path=Value.name, Mode=TwoWay}"
VerticalAlignment="Center" Foreground="Black"/>
<TextBox x:Name="TextBoxFlow" Text="{Binding Path=Value.flow, Mode=TwoWay}"
Grid.Column="1" Visibility="{Binding Children,
Converter={StaticResource BoxConverter},
ConverterParameter=\{box\}}"/>
<TextBlock x:Name="TextBlockThroughput" Text="{Binding Path=Value.throughput, Mode=TwoWay}"
Grid.Column="1" Visibility="{Binding Children,
Converter={StaticResource BoxConverter}, ConverterParameter=\{block\}}"/>
<Button x:Name="ButtonAddNode"/>
<Button x:Name="ButtonDeleteNode"/>
<Button x:Name="ButtonEditNode"/>
</Grid>
</Data:HierarchicalDataTemplate>
现在,正如您所看到的,TextBoxFlow和TextBlockThroughput共享相同的空间。 我的目标是:节点的“吞吐量”值是指通过此节点从其子节点流出多少东西。它不能直接更改,所以我想显示一个文本块。只有叶节点有一个TextBox才能让某人输入在此叶节点中生成的“流”。 (I.E。:Node.Throughput = Node.Flow + Sum(Children.Throughput),其中Node.Flow = 0表示每个非叶子。)
BoxConverter(愚蠢的名字-.-)的作用是什么:
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if ((value as NodeList<TreeItem>).Count > 1) // Node has Children?
{
if ((parameter as String) == "{box}")
{
return Visibility.Collapsed;
}
else ((parameter as String) == "{block}")
{
return Visibility.Visible;
}
}
else
{
/*
* As above, just with Collapsed and Visible switched
*/
}
}
绑定到TreeView的树的结构基本上是从Dan Vanderboom中窃取的(这里有点过多而无法转储整个代码),除了我在这里当然为子节点使用ObservableCollection和值项目实现INotifyPropertyChanged。
如果有人能向我解释,为什么在基础树中插入项目不会更新框和块的可见性,我将非常感激。
提前谢谢!
答案 0 :(得分:0)
发生的事情是每当属性发生变化时都会调用Converter。
但是,向集合中添加项目并不构成更改属性。毕竟它仍然是同一个系列。您需要做的是在集合更改时将ViewModel设置为NotifyPropertyChanged。这将导致转换器重新评估集合。