2014-11-23 63 views
1

我想在ListView上显示一些数据。数据来自HttpClient请求,但目前并不那么重要。在ListView中,我使用Stackpanel,在这里有数据。我想根据它们的值来设置Stackpanel内部的Stackpanel和Textblocks的格式。我能做到,但只能以复杂的方式。 这里是我的C#代码:Windows Phone 8.1条件格式化

public class TransTypeToAlignConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     var ttype = (int)value; 
     HorizontalAlignment align; 

     switch (ttype) 
     { 
      case 1: 
      case 3: 
       align = HorizontalAlignment.Right; 
       break; 
      case 2: 
       align = HorizontalAlignment.Left; 
       break; 
      case 6: 
       align = HorizontalAlignment.Stretch; 
       break; 
      default: 
       align = HorizontalAlignment.Stretch; 
       break; 
     } 
     return align; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

而XAML代码:

<Page.Resources> 
    <local:TransTypeToAlignConverter x:Key="TransTypeToAlign" /> 
</Page.Resources> 

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <ListView x:Name="myList" Height="Auto" Grid.Row="1"> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="ListViewItem"> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
      </Style> 
     </ListView.ItemContainerStyle> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Grid Margin="10,0,10,0"> 
        <Rectangle Fill="DarkGray" Width="320" Margin="3,18,0,0" HorizontalAlignment="{Binding transactionType, Converter={StaticResource TransTypeToAlign}}"/> 
        <StackPanel Width="320" Margin="0,13,3,3" HorizontalAlignment="{Binding transactionType, Converter={StaticResource TransTypeToAlign}}" Background="Gray"> 
       </Grid> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

正如我所提到的,此代码工作。但我想要格式化其他内容,而不仅仅是对齐。例如,我想要一个动态的Stackpanel宽度,而不是修复320px。为此,我应该写一个类似于上面的代码。我认为对于类似的东西来说代码太多了,以后很难修改。

我有一个值(TransType),它定义了对齐方式,堆叠面板宽度,文本块消息和文本的颜色。那么,是否可以制作用于格式化xaml的模板?

+0

如何编写自己的元素继承了一个StackPanel的例子SO? – user114111121 2014-11-23 17:41:18

+0

我粘贴了更多的代码。请检查。 Stackpanel在Grid中包含更多元素。 – Speederer 2014-11-23 18:20:10

回答

0

该模式的批评来自MVVM的创建者John Gossman本人,他指出实现MVVM的开销对于简单的UI操作来说“过量”。 MVVM Wiki

您可以使用多个转换器做,或者你可以用ItemTemplateSelector做到这一点,你需要定义每个模板分开后一种情况。

使用ItemTemplateSelector

GridView ItemTemplateSelector

+0

谢谢,这非常有帮助!和我的应用程序完美的工作(至少这个功能:)) – Speederer 2014-11-23 22:17:57