【问题标题】:DataBinding GridView C# windows store appDataBinding GridView C# windows store app
【发布时间】:2013-01-22 15:58:39
【问题描述】:

我有一个如下定义的 DataTemplate

<DataTemplate x:Key="IconTextDataTemplate">
        <StackPanel Orientation="Horizontal" Width="220" Height="60">
            <Border Background="#66727272" Width="40" Height="40" Margin="10">
                <Image Source="/SampleImage.png" Height="32" Width="32" Stretch="UniformToFill"/>
            </Border>
            <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                <TextBlock Text="{Binding Path=Title}" Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis" />
                <TextBlock  Text="{Binding Path=NumberOfPhotos}" Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis"/>
            </StackPanel>
        </StackPanel>
    </DataTemplate>

然后我有一个使用 DataTemplate 的 GridView

<GridView x:Name="gv" Grid.Row="0" HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" 
                  Width="Auto" Height="Auto" SelectionMode="Multiple" ItemTemplate="{StaticResource IconTextDataTemplate}" ItemsSource="{Binding}">
            <GridView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapGrid MaximumRowsOrColumns="8" 
                  VerticalChildrenAlignment="Top" HorizontalChildrenAlignment="Center" />
                </ItemsPanelTemplate>
            </GridView.ItemsPanel>
        </GridView>

然后我将 GridViews dataContext 设置为一个集合

gv.DataContext = setCollection;

对象 setCollection 是对象的集合,具有 NumberOfPhotos 和 Title 属性所以绑定

<TextBlock Text="{Binding Path=Title}" Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis" />
                <TextBlock  Text="{Binding Path=NumberOfPhotos}" Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis"/>

有效。但是,该对象没有 ImageSource 的属性

<Image Source="/SampleImage.png" Height="32" Width="32" Stretch="UniformToFill"/>

我不想绑定到对象的属性,而是绑定到由两个字符串和对象的属性组成的复合结构,如下所示:

ImageSource = "/files/thumbnails/" + {Binding Path=Title} + fileType;

所以当评估时,ImageSource 变为

/files/thumbnails/titleOfObject.png

titleOfObject 在这里等于该值

<TextBlock Text="{Binding Path=Title}" Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis" />  

我怎样才能做到这一点?

【问题讨论】:

    标签: c# windows-store-apps


    【解决方案1】:

    您最好将绑定的对象视为 ViewModel。从概念上讲,这意味着 ViewModel 对象的工作是准备数据以供查看。这包括诸如按摩要绑定到 Source 属性的标题之类的事情。因此,在您的对象(或派生对象,或对象的正式 ViewModel)上,创建一个为您执行该计算的属性。

    public string TitleImageSource
    {
        get
        {
            return string.Format(@"/files/thumbnails/{0}{1}", this.Title, fileType);
        }
    }
    

    然后绑定到你的图片中的那个属性。

    另一种方法是为绑定创建一个转换器。转换器可能类似于:

    public sealed class ImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            return string.Format(@"/files/thumbnails/{0}{1}", value, parameter);
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            return string.Empty;
        }
    }
    

    然后在 Image 标签的 Source 绑定上引用该转换器。

    【讨论】:

    • 我个人不太喜欢的另一种选择(但可以承认这是个人偏见)是创建一个或多或少做相同事情的转换器并将其应用于绑定。
    • 所以答案是使用为您计算格式的属性创建绑定对象的新对象?我想到了这一点,但由于基类是密封的,所以这相当困难,我将不得不重写绑定类。你提到的另一种我不熟悉的方法,我会查找ViewModels。
    • 如果你不能自己改变对象,那么可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多