在wpf应用程序中,我已经将字典绑定到列表框。我在listbox上有自己的风格。列表框项目包括图像和3个文本块。
Friend类在这里:
public class FriendData
{
public string idUser { get; set; }
public string nick { get; set; }
public string sefNick { get; set; }
public string status { get; set; }
public string photo { get; set; }
public string sex { get; set; }
public string isFriend { get; set; }
public string blockQuote { get; set; }
public FriendData(string idUser, string nick, string sefNick, string status, string photo, string sex, string isFriend)
{
this.idUser = idUser;
this.nick = nick;
this.sefNick = sefNick;
this.status = status;
this.photo = photo;
this.sex = sex;
this.isFriend = isFriend;
}
}ListBox风格如下:
<Style x:Key="friendsListStyle" TargetType="{x:Type ListBox}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid Name="MainGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.3*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="60"></RowDefinition>
</Grid.RowDefinitions>
<Image Source="{Binding Value.photo}" Margin="4,4,4,2"/>
<Grid Name="SlaveGrid" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Name="tbName" Text="{Binding Value.nick}" Grid.Column="0" Grid.Row="0" Margin="2,2,2,2" FontSize="13" FontWeight="Medium"></TextBlock>
<TextBlock Name="tbBlockQuote" Text="{Binding Value.blockQuote}" Grid.Column="0" Grid.Row="1" Margin="2,2,2,2" FontSize="11" FontWeight="Normal" Foreground="DarkGray"></TextBlock>
<TextBlock Name="tbStatus" Text="{Binding Value.status}" Grid.Column="0" Grid.Row="2" Margin="2,2,2,2" FontSize="11" FontWeight="Normal"></TextBlock>
</Grid>
</Grid>
<DataTemplate.Triggers>
<!--<Trigger Property="IsMouseOver" Value="true">
<Setter Property="LayoutTransform" TargetName="MainGrid">
<Setter.Value>
<ScaleTransform ScaleX="1.35" ScaleY="1.35" />
</Setter.Value>
</Setter>
</Trigger>-->
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>我的第一个问题是,tbStatus绑定到类Friend的属性状态。Status只能有3个值: 0, 1,2。如果status的值为0,我需要将tbStatus.Text=设置为“Offline”,如果status的值为1,我需要将tbStatus.Text=设置为“Online”,如果status为2,则必须将tbStatus.Text=设置为“Just Log”。有没有可能这个条件是从listBox样式的XAML中设置的?
<TextBlock Name="tbStatus" Text="{Binding Value.status}" Grid.Column="0" Grid.Row="2" Margin="2,2,2,2" FontSize="11" FontWeight="Normal"></TextBlock>我的第二个问题是,如果status为0,我需要将Image转换为灰度。我有转换成灰度的函数。我想在listBox样式中设置这些条件。有什么进步吗?
下面是:
private void ConvertImageToGrayScaleImage(string uri)
{
Image grayImage = new Image();
BitmapImage bmpImage = new BitmapImage();
bmpImage.BeginInit();
bmpImage.UriSource = new Uri(uri);
bmpImage.EndInit();
FormatConvertedBitmap grayBitmap = new FormatConvertedBitmap();
grayBitmap.BeginInit();
grayBitmap.Source = bmpImage;
grayBitmap.DestinationFormat = PixelFormats.Gray8;
grayBitmap.EndInit();
grayImage.Source = grayBitmap;
LayoutRoot.Children.Add(grayImage);
}发布于 2010-11-04 04:28:24
在这两种情况下,您最好的选择是编写一个IValueConverter。
例如,这里有一个用于转换文本的方法:
public class StatusToTextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int status = Int32.Parse(value.ToString());
switch (status)
{
case 0:
return "Offline";
case 1:
return "Online";
case 2:
return "Just Log";
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string status = value.ToString();
switch (status)
{
case "Offline":
return 0;
case "Online":
return 1;
case "Just Log":
return 2;
}
return Binding.DoNothing;
}
}然后您的文本绑定就变成了(在XAML的相应参考资料部分添加了引用):
<TextBlock Name="tbStatus"
Text="{Binding Value.status,
Converter={StaticResource statusToText}}"
Grid.Column="0"
Grid.Row="2"
Margin="2,2,2,2"
FontSize="11"
FontWeight="Normal"></TextBlock>我将把图像转换器留给你,因为这是基本的东西,它本质上是这段代码的重复。
请注意,这是硬编码值,这并不是真正的最佳实践。如果您计划本地化此应用程序,您可能应该使用枚举以及资源(而不是硬编码字符串)。
https://stackoverflow.com/questions/4090893
复制相似问题