我在VS2015中有一个WPF应用程序。它已被开发为MVVM,在代码隐藏类中没有任何内容。
它有一个包含数据网格的用户控件。我希望任何编辑过的单元格的背景颜色从白色变为红色。我有一个绑定到视图模型中的方法的按钮,该方法将更改的数据应用于数据库。
我的问题是绑定datagrid列的 Background 属性。
我的ViewModel包含:
df$unique <- mapply(function(x, y){
u <- setdiff(union(x, y), intersect(x, y))
paste0(u[!is.na(u)], collapse = '')
}, strsplit(df$col1, ''), strsplit(df$col2, ''))
# >df
# col1 col2 unique
# 1 <NA> cc c
# 2 a a
# 3 ab a b
ComparisonRec实现 ClientEntityBase
private ObservableCollection<ComparisonRec> _piToAccessFilteredRecs;
这有一个 IsDirty 属性
我有以下 ValueConverter 类:
public class ComparisonRec : ClientEntityBase
我的用户控件的数据上下文设置如下:
public class DirtyToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Brush ret;
if ((bool)value == true)
{
ret = Brushes.Red;
}
else
{
ret = Brushes.White;
}
return ret;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
在DataGrid中我有绑定:
<UserControl.DataContext>
<local:CompareUCViewModel />
</UserControl.DataContext>
对于我需要突出显示更改的 DataGridTextColumn ,我有以下绑定:
ItemsSource="{Binding PiToAccessFilteredRecs}"
这可以很好地显示数据。为了尝试突出显示,我添加了以下内容:
Binding="{Binding Path=Access_Notes, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
它无法正常工作:(我在显示的每一行的输出窗口中看到以下内容:
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background" Value="{Binding Access_Notes.IsDirty, Converter={StaticResource DirtyToBrushConverter}}" />
</Style>
</DataGridTextColumn.ElementStyle>
有人能看到我出错的地方吗?
EDIT 根据@XAMIMAX建议,如果我将绑定更改为:
System.Windows.Data Error: 40 : BindingExpression path error: 'IsDirty' property not found on 'object' ''String' (HashCode=577941586)'. BindingExpression:Path=Access_Notes.IsDirty; DataItem='ComparisonRec' (HashCode=27207830); target element is 'TextBlock' (Name=''); target property is 'Background' (type 'Brush')
Access_Notes的字符串值(将在网格单元格中显示的内容)传递给值转换器并抛出异常,因为无法将其强制转换为(bool)
答案 0 :(得分:1)
我在这里找到答案:binding to a property of an object
因为DataGridTextColumn已经绑定到Access_Notes,这意味着我的setter只需要绑定到IsDirty属性,如下所示:
Value="{Binding IsDirty
为了完整起见,我的工作xaml如下:
<DataGridTextColumn x:Name="access_NotesColumn" Width="SizeToHeader" Header="Access Notes" Binding="{Binding Path=Access_Notes, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background" Value="{Binding IsDirty, Converter={StaticResource DirtyToBrushConverter}}" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>