2014-11-23 92 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