我动态地生成TreeView(TV)的内容,并且根据我用于获取树的项目的某些属性,想要将按钮附加到某些TreeViewItems(TVI)。
我的应用程序中某个特定电视的所有TVI都需要此功能。可能简化任务的一点是,该树中的所有根项都需要按钮。换言之,除TVI内部的TVI外,特定电视内的每个TVI都需要一个按钮。
我在思考模板的想法,但我只能看到如何为电视中的所有TVI添加按钮。另一种选择(我认为......我还没试过这个但是听起来还不错)就是只需在电视中的所有内容上添加按钮,然后将源项目的相关属性绑定到按钮的可见性上,这似乎是一个完整的黑客,我大多相信必须有一个更优雅的解决方案。
关于如何解决此问题的任何想法?
答案 0 :(得分:2)
如果您在视图模型中动态建立数据属性,那么您可以考虑使用DataTemplateSelector。
在实施中,检查数据项是否有子项。如果是,请使用按钮返回数据模板。如果没有,则返回数据模板而不使用按钮。类似的东西:
public class ButtonDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item,
DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null)
{
YourClass itemAsYourClass = item as YourClass;
if(itemAsYourClass != null)
{
bool hasChildren = itemAsYourClass.Children != null
&& itemAsYourClass.Children.Count > 0;
return element.FindResource(hasChildren
? "withButtonTemplate"
: "withoutButtonTemplate"
);
}
}
return null;
}
}
答案 1 :(得分:0)
这是我使用的代码:
类CurrentDriveDataTemplateSelector:DataTemplateSelector { public DataTemplate currentDriveTemplate {get;组;} public DataTemplate dirTemplate {get;组; }
public override DataTemplate SelectTemplate(object item,
DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null)
{
Directory dir = item as Directory;
if (dir != null)
{
bool isCurrentDrive = ((dir.parent == 0) && (dir.state == "current"));
if (isCurrentDrive)
{
return currentDriveTemplate;
}
return dirTemplate;
}
}
}
}
<HierarchicalDataTemplate x:Key="normalDirTemplate" ItemsSource="{Binding Path=childdirs}">
<TextBlock Text="{Binding Path=name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="currentDriveTemplate" ItemsSource="{Binding Path=childdirs}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=name}" Width="100"/>
<Button Content="=>" Width="20"></Button>
</StackPanel>
</HierarchicalDataTemplate>
<mine:CurrentDriveDataTemplateSelector
currentDriveTemplate="{StaticResource currentDriveTemplate}"
dirTemplate="{StaticResource normalDirTemplate}"
x:Key="CurrentDriveDataTemplateSelector"/>
...blah
<TreeView Height="324" Margin="0,25,0,0" x:FieldModifier="private" x:Name="currentDirectoryTree" Width="150" ItemTemplateSelector="{StaticResource CurrentDriveDataTemplateSelector}">
...etc