Silverlight 4:用一点逻辑来显示数据的模式?
我正在构建一个wp7应用程序 我有一个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
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