none
请问如何实现条件格式或是条件模板?

    問題

  • 比如说我用了一个listbox,并设计了一个自己的itemtemplate,用于绑定数据。

    现在我希望如果数据中的一个属性(比如说金额)大于10000元的,就采用红色的字体,大于20000元的,采用红色加粗体...?

    还有,比如我的数据中有一个属性是一个枚举型,例如“汽车、飞机、轮船”,我有三个不同的图片“car.jpg, plane.jpg, ship.jpg"用于不同的项的显示,应该如何处理?

    更进一步,如果我想利用数据做条件,各个数据项采用不同的模板,该如何实现?


    HAL
    2009年5月20日 上午 04:56

解答

  •  <UserControl.Resources>
    
            <me:ColorConverter x:Key="MyConverter" />
    
        </UserControl.Resources>
    
        <Grid x:Name="LayoutRoot" Background="White">
    
                    <ListBox x:Name="listBox" Width="300" Height="500">
    
                        <ListBox.ItemTemplate>
    
                            <DataTemplate>
    
                                <TextBox IsReadOnly="True" Background="{Binding Amount, Converter={StaticResource MyConverter}}" Text="{Binding Amount}" />
    
                            </DataTemplate>
    
                        </ListBox.ItemTemplate>
    
                    </ListBox>
    
    
    
    

        public class ColorConverter : IValueConverter
        {
            #region IValueConverter Members
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                int amount = (int)value;
                if (amount > 1000)
                    return new SolidColorBrush(Colors.Red);
                else
                    return new SolidColorBrush(Colors.Green);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
            #endregion
        }

    2009年5月20日 下午 08:18

所有回覆

  •             if (i > 10000  && i < 20000)
                {
                    myListBox.Style = Application.Current.Resources["Style0"] as Style;
                }
                if (i > 20000)
                {
                    myListBox.Style = Application.Current.Resources["Style1"] as Style;
                }
    你的Template要放在 app.xaml里面,就可以直接通过Application.Current.Resources["Style1"] as Style调用了
    2009年5月20日 上午 07:10

  • 好像不对吧!

    我要做的是自动的数据绑定,就是一句:myListBox.ItemSource = lstMyRecords; 那么上面的程序放在哪里呢?databinding这类事件的响应里?

    我的意思是,比如有10条数据,显示在listbox里为每一项。能不能根据不同的数据特征,而为每一个数据项应用不同的风格、模板什么的。

    上面的程序好像是把整个listbox的格式都变了。


    有没有用设计的方式来实现?比如在XAML里实现?
    HAL
    2009年5月20日 上午 08:40
  • 这个好像就不行了,如果非要如此做,就开发个自己的ListBox控件吧,毕竟是少数人的少数需求。
    2009年5月20日 上午 10:29
  • 可是这种需求很常见呀!设置一个业务指标警示灯之类的。

    另外,根据不同的记录类型,用一个不同的图标放在行首,这从前也很常这么干呀!
    HAL
    2009年5月20日 上午 10:31
  • 又传说的信号灯 = .=哈哈,你这个不用模板吧,用DataTemplate,content里面包括一个Image一个TextBlock就行了吧
    2009年5月20日 上午 10:44
  •  <UserControl.Resources>
    
            <me:ColorConverter x:Key="MyConverter" />
    
        </UserControl.Resources>
    
        <Grid x:Name="LayoutRoot" Background="White">
    
                    <ListBox x:Name="listBox" Width="300" Height="500">
    
                        <ListBox.ItemTemplate>
    
                            <DataTemplate>
    
                                <TextBox IsReadOnly="True" Background="{Binding Amount, Converter={StaticResource MyConverter}}" Text="{Binding Amount}" />
    
                            </DataTemplate>
    
                        </ListBox.ItemTemplate>
    
                    </ListBox>
    
    
    
    

        public class ColorConverter : IValueConverter
        {
            #region IValueConverter Members
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                int amount = (int)value;
                if (amount > 1000)
                    return new SolidColorBrush(Colors.Red);
                else
                    return new SolidColorBrush(Colors.Green);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
            #endregion
        }

    2009年5月20日 下午 08:18
  • 关键是,要用不同的图标嘛,飞机的记录用飞机的,汽车用汽车的。 :(


    HAL
    2009年5月21日 上午 12:43
  • 上面的解决办法应该是能行的。但是可惜是用代码实现的。如果用模板标记来实现就好了。而且不能实现模板切换(是不是根本就不可能实现不同记录的模板切换?)

    如果没有更好的答案,我就把这个答案标记为解决好了。


    HAL
    2009年5月21日 上午 12:45