【问题标题】:Nested ListView not binding correctly嵌套的 ListView 未正确绑定
【发布时间】:2014-09-06 18:09:43
【问题描述】:

我正在为每个包含属性列表的产品列表处理 XAML。当我输入静态文本时,我的 XAML 可以正常工作,但是当我尝试使用对象属性时,什么都没有显示。

这是我的 XAML:

<ListView ItemsSource="{Binding Products}">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid HorizontalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition />
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Name}" FontSize="32" Margin="5" />
                        <GridView Grid.Column="1" ItemsSource="{Binding Attributes}">
                            <GridView.ItemContainerStyle>
                                <Style TargetType="GridViewItem">
                                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                                    <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                </Style>
                            </GridView.ItemContainerStyle>
                            <GridView.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Key}" Foreground="White" Height="Auto"/>
                                        <TextBlock Text="{Binding Value}" Foreground="White" Height="Auto"/>
                                    </StackPanel>
                                </DataTemplate>
                            </GridView.ItemTemplate>
                        </GridView>

                        <Grid Grid.Column="2">
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>

                            <TextBlock Text="Here is some selling point about product 1." FontSize="14" Margin="5" />
                            <StackPanel Grid.Row="1" Orientation="Horizontal">
                                <TextBlock Margin="5" FontSize="14" Text="1/4 oz: $150" />
                                <TextBlock Margin="5" FontSize="14" Text="1/2 oz: $250" />
                                <TextBlock Margin="5" FontSize="14" Text="1 oz: $450" />
                            </StackPanel>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
            <Style TargetType="ListView">
                <Setter Property="HorizontalAlignment" Value="Stretch"/>
            </Style>
        </ListView>

这是我的对象定义:

public class Product
{

    public string Name { get; set; }

    public string SellingPoint { get; set; }

    public List<KeyValuePair<string, string>> Attributes { get; set; }

    public Scale Scale { get; set; }

    public UnitOfMeasure UoM { get; set; }
}

我最初只是尝试对属性使用字典,但发现字典没有 XAML 绑定。另一篇文章建议我使用 List> 代替。我知道我可以很好地绑定到属性,因为当我使用静态文本时,会为我创建的模拟对象显示正确数量的属性(每个产品有 2 个 KeyValuePairs)。

【问题讨论】:

    标签: c# xaml data-binding collections


    【解决方案1】:

    也许这不是您所要求的,但您可以为以下属性创建自己的类:

    public class Attribute
    {
      public string Name {get;set;}
      public string Value {get;set;}
    }
    

    然后您可以使用List&lt;Attribute&gt; 作为Product 类中的属性,而不是List&lt;KeyValuePair&lt;string, string&gt;&gt;

    您的 XAML 将如下所示:

    <GridView Grid.Column="1" ItemsSource="{Binding Attributes}">
                                <GridView.ItemContainerStyle>
                                    <Style TargetType="GridViewItem">
                                        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                                        <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                    </Style>
                                </GridView.ItemContainerStyle>
                                <GridView.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding Name}" Foreground="White" Height="Auto"/>
                                            <TextBlock Text="{Binding Value}" Foreground="White" Height="Auto"/>
                                        </StackPanel>
                                    </DataTemplate>
                                </GridView.ItemTemplate>
                            </GridView>
    

    【讨论】:

    • 感谢 Daniel,我试图避免创建自己的 KeyValuePair 版本,但我可能会走这条路,因为我似乎无法让内部版本正常工作。
    • 我一直都是这样做的,否则当你想绑定字典或键值对列表时会导致很多问题。
    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 2015-11-10
    • 2012-06-08
    • 2017-08-25
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多