WPF从DataTemplate样式绑定到ViewModel属性

时间:2015-10-13 18:40:16

标签: wpf xaml mvvm binding datatemplate

我正在尝试将所有reservation = Reservation.objects.create(user=forUser, resource=resource, timeFrom=timeFrom, timeTo=timeTo, extendedReservation=extendedReservation.uuid) 项的ForeGround颜色绑定到TextBlock属性。 ViewModel元素位于TextBlock下,Grid本身定义在DataTemplate下。整个代码在UserControl

下定义

我正在尝试使用RelativeSource绑定来查找UserControl' s DataContext并获取我需要的属性。

XAML:

<my:MapControl>
    <my:MapControl.Resources>
        <ResourceDictionary>
            <DataTemplate x:Key="SomeTemplate">
                <Grid>
                     <Grid.RowDefinitions>
                          <RowDefinition />
                          <RowDefinition />
                     </Grid.RowDefinitions>
                     <Grid.Style>
                         <Style TargetType="Grid">
                              <Setter Property="TextElement.Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.TextColor}" />
                         </Style>
                     </Grid.Style>
                     <TextBlock Grid.Column="0" />
                     <TextBlock Grid.Column="1" />
                </Grid>
            </DataTemplate>
        </ResourceDictionary>
    </my:MapControl.Resources>
</my:MapControl>

视图模型:

public class MapViewModel
{
    public virtual string TextColor
    {
        get { return _textColor; }
        set
        {
            _textColor = value;
            this.RaisePropertyChanged("TextColor");
        }
    }
    private string _textColor = "Black";
}

上述绑定不起作用。如果我将Value绑定更改为硬编码值,例如&#34; Red&#34;例如,Foreground上的TextBlocks颜色正确显示。

如何让绑定与此设置一起使用?

2 个答案:

答案 0 :(得分:0)

分析

似乎是根本原因 - 绑定到string类型的实例而不是Brush类型的实例。

一些可能的解决方案:

  1. TextColor类的MapViewModel属性类型从string类型更改为SolidColorBrush类型,并更新MapViewModel的实施适当地上课。
  2. 创建IValueConverter接口的自定义实现,该接口以string作为输入并输出SolidColorBrush类型的实例。

答案 1 :(得分:0)

您使用的是哪个版本的.NET?适用于4.5,但IIRC没有使用早期版本,你必须明确声明solidcolorbrush:

<Style TargetType="Grid">
    <Setter Property="TextElement.Foreground">
        <Setter.Value>
            <SolidColorBrush Color="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.TextColor}" />
        </Setter.Value>
    </Setter>
</Style>

无论你做什么都不在视图模型中创建画笔或任何其他UI资源,它都违反了MVVM。