基本上,我有一个项目和子项目列表(全部在一个列表中)。我想缩进某些实际子项的特定项目。有没有我可以用来做这个的功能或属性?我已经尝试使用谷歌搜索,甚至在堆栈溢出时搜索它 - 但没有成功。
注意:我在Windows 8商店应用程序中使用C#和XAML。不是wpf应用程序(文档和代码有时会有所不同)。
编辑:
这是我的XAML的样子:
<ListView
x:Name="ListView"
AutomationProperties.AutomationId="ListView"
AutomationProperties.Name="items"
TabIndex="1"
Grid.Row="1"
Margin="-10,-10,0,0"
Padding="20,0,0,45"
IsSwipeEnabled="False"
SelectionChanged="ListView_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Margin="10,0,0,0">
<TextBlock x:Name="Item" Tag="{Binding ID}" Text="{Binding Name}" Style="{StaticResource TitleTextBlockStyle}" TextWrapping="Wrap" MaxHeight="40" FontSize="14" FontFamily="Global User Interface"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
列表视图绑定到一个可观察的对象列表。
答案 0 :(得分:1)
如果您只想缩进子项的文本,可以更改文本块或堆栈面板的边距。 为此,您将执行以下操作:
为要添加到列表视图的项目创建一个类
向该类添加一个IsSubItem属性
创建这些项目的可观察集合,并将它们绑定到列表视图源。
在ListView模板中,使用转换器将堆栈面板或文本块边距绑定到IsSubItem属性,以将IsSubItem布尔值转换为适当的边距。
答案 1 :(得分:1)
要在此处进一步扩展另一个答案...建议的路由是向基础类(在本例中为MyClass)添加属性,并将ListView的ItemsSource绑定到这些对象的列表。
public class MyClass
{
public bool IsSubItem { get; set; }
}
// Elsewhere in your code, you would need a list of these object
public ObservableCollection<MyClass> MyList { get; set; }
您还需要一个Converter类,它很容易设置: 你需要一个转换器类;一旦你掌握了它们,转换器就很容易了。这种情况的一个简单示例是:
public class BoolToMarginConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
//Get the passed in value and convert it to a boolean - the as keyword returns a null if we can't convert to a boolean so the ?? allows us to set a default value if we get a null instead
bool isSubItem = (value as bool?) ?? false;
// If the item IS a sub item, we want a larger Left Margin
// Since the Margin Property expects a Thickness, that's what we need to return
return new Thickness(isSubItem == true ? 24 : 12, 0, 0, 0);
}
// This isn't necessary in most cases, and in this case can be ignored (just required for the Interface definition)
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
完成此设置后,您需要将其作为资源添加到XAML中:
// Add a reference to your namespace if it isn't already in your XAML
xmlns:local="using:MyNamespace"
// You'll also need to add a static resource
<Page.Resources>
<local:BoolToMarginConverter x:Key="BoolToMarginConverter" />
</Page.Resources>
// And then lastly, you'll need to update your ListView XAML to use the new information
<ListView
x:Name="ListView"
ItemsSource={Binding MyList}
<!-- Other Properties removed for space -->
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="1">
<!-- Other info removed for space -->
<StackPanel Grid.Column="0" Margin="{Binding Path=IsSubItem, Converter={StaticResource BoolToMarginConverter}}">
<!-- Other info removed for space -->
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>