【问题标题】:WPF ListBoxItems problemWPF ListBoxItems 问题
【发布时间】:2010-11-03 19:31:17
【问题描述】:

在 wpf 应用程序中,我已将字典绑定到列表框。我在列表框上有自己的风格。 列表框项目包含图像和 3 个纹理块。

朋友班在这里:

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 的属性状态。状态只能有 3 个值:0,1,2。如果状态值为 0,我需要设置 tbStatus.Text="Offline",如果状态值为 1,我需要设置 tbStatus.Text="Online",如果状态为 2,则必须为 tbStatus.Text="Just Log"。这个条件可能是从 XAML 以 listBox 样式设置的吗?

<TextBlock Name="tbStatus" Text="{Binding Value.status}" Grid.Column="0" Grid.Row="2" Margin="2,2,2,2" FontSize="11" FontWeight="Normal"></TextBlock>

我的第二个问题是如果状态为 0,我需要将图像转换为灰度。我有 func 可以转换为灰度。我想以 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);

}

【问题讨论】:

  • 这是很多代码,很少有问题。你能删减代码直到你有一个重现问题的最小集合吗?

标签: wpf styles listboxitems


【解决方案1】:

在这两种情况下,最好的办法是写一个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>

我会把图像转换器留给你,因为这是基本的东西,它基本上是这段代码的重复。

请注意,这是硬编码值,并不是真正的最佳实践。如果您打算本地化此应用程序,您可能应该使用枚举和资源(而不是硬编码字符串)。

【讨论】:

  • 非常感谢,您的进步对我很有帮助,我是WPF的新手。祝你有美好的一天
  • @Tom - 没问题。仅供参考 - 我注意到您没有将任何问题的答案标记为答案(尽管您很可能已经投票支持它们,这很好)。如果对您的问题给出的答案确实帮助您解决了问题,请选中复选标记作为答案 - 当您提出更多问题时,如果您有良好的声誉,人们可能更愿意为您提供答案。
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多