【问题标题】:Binding to a Rectangle within a ListBox ItemTemplate?绑定到 ListBox ItemTemplate 中的矩形?
【发布时间】:2014-01-16 21:08:03
【问题描述】:

我有一个 ListBox,它对内容使用数据绑定(绑定到 ObservableCollection),并使用 ItemTemplate 进行布局。在 ItemTemplate 中,有一个显示日期的 TextBlock(来自 ObservableCollection)和一个彩色矩形。

我希望矩形的填充颜色根据日期变化(表示年龄)。但是,由于 Rectangle 本身并没有绑定到日期(而且我不知道它是如何绑定的),所以我无法让 DataTrigger 来改变填充颜色。

还有其他方法可以让 Rectangle 颜色由数据绑定控制吗?

编辑:

根据要求,这是我的 ListBox ItemTemplate 的(简化)副本。现在,矩形的填充是一种固定颜色,但我想根据 targetstartdate 字段对其进行更改。

<ListBox Name="listBox1" ItemsSource="{Binding Path=testList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="1*" />
                </Grid.ColumnDefinitions>
                <Rectangle Fill="#FF009A00" Width="5" StrokeThickness="1" Margin="0,1,4,1"/>
                <TextBlock Text="{Binding targetstartdate}" Margin="0,0,0,4" Foreground="#FF009A00" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

【问题讨论】:

  • 你不需要任何Converter...你可以使用DataTrigger。添加你的DataTemplate,我会告诉你的。
  • McCarnagle 几乎为您准备好了。您需要做的就是在 Convert 方法中定义您的转换器逻辑,然后绑定它,所以他将 Stroke="{Binding Date ... 在第一个代码片段中,用 Stroke="{Binding targetstartdate 替换它,因为那是您的 var 的实际名称。
  • 查看它,我收回它......它看起来不像你可以DataTrigger做到这一点。起初我以为你只是想要某些日期来改变颜色,但仔细研究后发现它比我最初想象的要复杂得多。即使有可能,并且您希望在不同的日期范围内使用不同的颜色,那么您仍然需要使用 Converter 方法。

标签: c# wpf


【解决方案1】:

您可以将矩形的FillStroke 属性绑定到日期。然后,使用IValueConverter 将日期转换为适当的颜色。

<Window.Resources>
    <local:DateToBrushConverter x:Key="DateToBrushConverter" />
</Window.Resources>

<Rectangle Fill="{Binding targetstartdate,Converter={StaticResource DateToBrushConverter}}" 
... />

Convert 方法应返回一个 Brush 对象,该对象与 Rectangle.Fill 属性匹配。

public class DateToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var date = value as DateTime?;
        if (!date.HasValue)
            return new SolidColorBrush(Colors.Transparent);
        else if (!date.Value > DateTime.Today.AddDays(-1))
            return new SolidColorBrush(Colors.Blue);
        // etc
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

    【解决方案2】:

    将矩形的颜色绑定到 IValueConverter,使用日期作为绑定,并根据 IValueConverter 类中的日期确定颜色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-01
      • 2012-07-29
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多