【问题标题】:Windows Phone 8.1 conditional formattingWindows Phone 8.1 条件格式
【发布时间】:2015-01-21 08:46:17
【问题描述】:

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

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 的模板?

【问题讨论】:

  • 如何编写自己的元素来继承堆栈面板?
  • 我粘贴了更多代码。请检查。 Stackpanel 在 Grid 中包含更多元素。

标签: xaml formatting windows-phone-8.1 conditional


【解决方案1】:

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

您可以使用多个转换器,也可以使用ItemTemplateSelector,在后一种情况下,您需要分别定义每个模板。

使用ItemTemplateSelector的SO示例

GridView ItemTemplateSelector

【讨论】:

  • 谢谢,非常有帮助!而且我的应用程序可以完美地使用这个(至少这个功能):)
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多