Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 4:用一点逻辑来显示数据的模式?_Silverlight_User Interface - Fatal编程技术网

Silverlight 4:用一点逻辑来显示数据的模式?

Silverlight 4:用一点逻辑来显示数据的模式?,silverlight,user-interface,Silverlight,User Interface,我正在构建一个wp7应用程序 我有一个UserControl,它显示新闻文章的标题、摘要和图像。整个课程都很短: public partial class StoryControl : UserControl { public Story Story { get; private set; } public StoryControl() { InitializeComponent(); } internal StoryControl(S

我正在构建一个wp7应用程序

我有一个
UserControl
,它显示新闻文章的标题、摘要和图像。整个课程都很短:

public partial class StoryControl : UserControl
{
    public Story Story { get; private set; }

    public StoryControl()
    {
        InitializeComponent();
    }

    internal StoryControl(Story story) : this()
    {
        this.Story = story;
        Teaser.Text = story.Teaser;
        Headline.Text = story.Title;

        if (story.ImageSrc == null)
        {
            Thumbnail.Visibility = Visibility.Collapsed;
        } else
        {
            Thumbnail.Source = new BitmapImage(story.ImageSrc);
        }
    }
}
以及相应的XAML:

<Grid x:Name="LayoutRoot" Background="Transparent" Margin="0,0,0,20">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Image x:Name="Thumbnail" Grid.Column="0" Width="89" HorizontalAlignment="Left" VerticalAlignment="Top" />

    <!-- sometimes there's a hanging word in the headline that looks a bit awkward -->
    <TextBlock x:Name="Headline" Grid.Column="1" Grid.Row="0" Style="{StaticResource PhoneTextAccentStyle}" TextWrapping="Wrap" HorizontalAlignment="Left" FontSize="23.333" VerticalAlignment="Top" />
    <TextBlock x:Name="Teaser" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" HorizontalAlignment="Left" Style="{StaticResource PhoneTextSubtleStyle}"  TextWrapping="Wrap" VerticalAlignment="Top" Width="384"/>
</Grid>

有没有一种方法可以减少代码落后,增加XAML?如何使用绑定将
标题
摘要
的文本绑定到
故事
的属性,同时在
故事
为空时不崩溃


关于图像?我有一点逻辑性;是否有某种方法可以在XAML中自动执行此操作,或者我在C#中无法执行此操作?

看起来ViewModel已经就绪:

public class StoryViewModel
{
    readonly Story story;

    public StoryViewModel(Story story)
    {
        this.story = story;
    }

    public string Teaser { get { return story == null ? "" : story.Teaser; } }
    public string Title { get { return story == null ? "" : story.Title; } }
    public bool IsThumbnailVisible { get { return story != null && story.ImageSrc != null; } }
    public BitmapImage Thumbnail { get { return IsThumbnailVisible ? new BitmapImage(story.ImageSrc) : null; } }
}
使您的codebehind变得漂亮和简单:

public partial class StoryControl : UserControl
{
    public Story Story { get; private set; }

    public StoryControl()
    {
        InitializeComponent();

    }

    internal StoryControl(Story story)
        : this()
    {
        this.DataContext = new StoryViewModel(story);
    }
}
您的XAML将成为一组绑定:

<Grid x:Name="LayoutRoot" Background="Transparent" Margin="0,0,0,20">
    <Grid.Resources>
        <BooleanToVisibilityConverter x:Key="booleanToVisiblityConverter"/>
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Image Visibility="{Binding IsThumbnailVisible, Converter={StaticResource booleanToVisiblityConverter}}" Source="{Binding Thumbnail}" Grid.Column="0" Width="89" HorizontalAlignment="Left" VerticalAlignment="Top" />

    <!-- sometimes there's a hanging word in the headline that looks a bit awkward -->
    <TextBlock Text="{Binding Title}" Grid.Column="1" Grid.Row="0" Style="{StaticResource PhoneTextAccentStyle}" TextWrapping="Wrap" HorizontalAlignment="Left" FontSize="23.333" VerticalAlignment="Top" />
    <TextBlock Text="{Binding Teaser}" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" HorizontalAlignment="Left" Style="{StaticResource PhoneTextSubtleStyle}"  TextWrapping="Wrap" VerticalAlignment="Top" Width="384"/>

</Grid>


好的,通过回退值和更复杂的转换器,仅使用模型(故事)和视图(xaml)就可以做到这一点,但我希望您会发现viewmodels在可测试、无砖墙、视图特定逻辑方面为您提供了最强大的功能…

看起来不错,尽管我在使用
booleanToVisiblityConverter
时遇到了问题。我需要对静态资源执行一些操作?编辑以将实际转换器包含在静态资源中。通常情况下,您会在更高的级别(如Window或AppOk)上声明这一点。我得到一个找不到的错误。Windows Phone 7不支持BooleanToVisibilityConverter吗?BooleanToVisibilityConverter必须是您创建的自定义转换器。BooleantVisibilityConverter存在于WPF中,但不存在于WP7(基于Silverlight 3)。这是一个布尔可视性转换器示例。这里有一个关于如何使用转换器的链接。谢谢你,乔!我完全错过了OP的第一句话:s