从DataTemplate样式到ViewModel属性的WPF绑定

从DataTemplate样式到ViewModel属性的WPF绑定,wpf,xaml,mvvm,binding,datatemplate,Wpf,Xaml,Mvvm,Binding,Datatemplate,我正在尝试将所有TextBlock项目的前景色绑定到ViewModel属性。TextBlock元素位于DataTemplate下定义的网格下。整个代码是在UserControl下定义的 我正在尝试使用RelativeSource绑定来查找UserControl的DataContext并获得所需的属性 XAML: 上面的绑定不起作用。如果我将值绑定更改为硬编码值,例如红色,则这些文本块上的前景色显示正确 如何使绑定与此设置一起工作?Analysis 这似乎是根本原因——绑定到字符串类型的实例,而不

我正在尝试将所有TextBlock项目的前景色绑定到ViewModel属性。TextBlock元素位于DataTemplate下定义的网格下。整个代码是在UserControl下定义的

我正在尝试使用RelativeSource绑定来查找UserControl的DataContext并获得所需的属性

XAML:

上面的绑定不起作用。如果我将值绑定更改为硬编码值,例如红色,则这些文本块上的前景色显示正确

如何使绑定与此设置一起工作?

Analysis 这似乎是根本原因——绑定到字符串类型的实例,而不是笔刷类型的实例

一些可能的解决方案: 将MapViewModel类的TextColor属性的类型从字符串类型更改为SolidColorBrush类型,并相应地更新MapViewModel类的实现。 创建IValueConverter接口的自定义实现,该接口将字符串作为输入并输出SolidColorBrush类型的实例。
您使用的是什么版本的.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>

无论您做什么,只要不在viewmodel中创建画笔或任何其他UI资源,就违反了MVVM。

粘贴忘记实现INPC接口的代码时是否删除了它:MapViewModel:INotifyPropertyChanged。如果这只是简化,那么您确定MapViewModel是UserControl的DataContext吗?如果在TextColor属性的get中放置断点,是否调用它?观察输出窗口Ctrl+Alt+O中与数据绑定相关的任何错误消息。按照dkozl的建议检查DataContext的分配。当做
public class MapViewModel
{
    public virtual string TextColor
    {
        get { return _textColor; }
        set
        {
            _textColor = value;
            this.RaisePropertyChanged("TextColor");
        }
    }
    private string _textColor = "Black";
}
<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>