两个列值的数据触发比较
Datatrigger comparison of two column values
我正在尝试根据同一行中两个单元格的比较值来设置 DataTrigger
。我的困难是单元格不是(也不可能是)同一项目的属性。网格是在代码隐藏中生成的。
public class EqualityConverter : IValueConverter
{
public object Convert(object values, Type targetType, object parameter, CultureInfo culture)
{
string currentValue = values.ToString();
string compareToValue = Column[2].Item.Value.ToString(); //This clearly doesn't work, but it's the intent I'm after.
if (currentValue.Equals(compareToValue))
return false;
return true;
}
XAML
(Binding Path=Value)
效果很好。
(ConverterParameter = Column2.Value)
是我的问题所在。
有什么关于如何找回这个的建议吗???
<DataTrigger Binding="{Binding Path=Value, Converter={StaticResource EqualityConverter}}" Value="True">
<Setter Property="Background" Value="Yellow" />
</DataTrigger>
我无法绑定到项目 属性 的原因是单元格值本身就是一个项目:所以我试图与 Column2 的 "Value" 属性 进行比较。
public class GenericProperty : INotifyPropertyChanged
{
public GenericProperty(string name, object value)
{
Name = name;
Value = value;
}
public string Name { get; private set; }
public object Value { get; set; }
每个 DataGridCell
的 DataContext
是 DataGridRow
中显示的记录(项目)。因此,您所要做的就是比较第二个 Column
.
中显示的 属性 的值
<DataTrigger Binding="{Binding secondColumnProp}" value="True">
<Setter Property="Background" Value="Yellow"/>
</DataTrigger>
用户评论后更新#1
您必须使用 DataGridCell
的 Loaded
事件,因为届时将评估绑定。
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<EventSetter Event="Loaded" Handler="DataGridCell_Loaded"/>
</Style>
</DataGrid.CellStyle>
void DataGridCell_Loaded(object sender, RoutedEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
DependencyObject reference = cell;
while (reference.GetType() != typeof(DataGridRow))
reference = VisualTreeHelper.GetParent(reference);
DataGridRow row = reference as DataGridRow;
while (reference.GetType() != typeof(DataGrid))
reference = VisualTreeHelper.GetParent(reference);
DataGrid grid = reference as DataGrid;
FrameworkElement elem = grid.Columns[2].GetCellContent(row);
// use elem.DataContext, or traverse elem's visualtree to do something
// code below is just an example
if (elem is TextBlock)
{
System.Diagnostics.Debug.WriteLine((elem as TextBlock).Text);
if ((elem as TextBlock).Text == "34")
cell.Background = Brushes.DarkMagenta;
}
}
经过大量努力寻找更简单、更直接的解决方案...我最终向我的对象添加了一个 属性 作为占位符来识别匹配值:
public GenericProperty(string name, object value, string match)
{
Name = name;
Value = value;
** Match = match; **
}
public string Name { get; private set; }
public object Value { get; set; }
public string Match { get; set; }
然后我有一个循环遍历我的集合的方法,并将我的新 属性 的值设置为 "true" 以匹配我的 "column 2" 项目:
private void IdentifyMatchingItems(ObservableCollection<GenericObject> groupedCollection)
{
foreach (var collectionObject in groupedCollection)
{
int x = collectionObject.Properties.Count;
int propertyCount = x - 1;
string masterValue = collectionObject.Properties[2].Value.ToString();
// string ObjectNotNull = collectionObject.Properties[propertyNumber].Value.ToString();
for (int i = 2; i <= propertyCount; i++)
{
if (collectionObject.Properties[i].Value.Equals(masterValue))
{
collectionObject.Properties[i].Latest = "yes";
}
}
}
}
最后,我有一个数据触发器,它根据 "Match" 属性.
设置我的 dataGrid 单元格的样式
我正在尝试根据同一行中两个单元格的比较值来设置 DataTrigger
。我的困难是单元格不是(也不可能是)同一项目的属性。网格是在代码隐藏中生成的。
public class EqualityConverter : IValueConverter
{
public object Convert(object values, Type targetType, object parameter, CultureInfo culture)
{
string currentValue = values.ToString();
string compareToValue = Column[2].Item.Value.ToString(); //This clearly doesn't work, but it's the intent I'm after.
if (currentValue.Equals(compareToValue))
return false;
return true;
}
XAML
(Binding Path=Value)
效果很好。
(ConverterParameter = Column2.Value)
是我的问题所在。
有什么关于如何找回这个的建议吗???
<DataTrigger Binding="{Binding Path=Value, Converter={StaticResource EqualityConverter}}" Value="True">
<Setter Property="Background" Value="Yellow" />
</DataTrigger>
我无法绑定到项目 属性 的原因是单元格值本身就是一个项目:所以我试图与 Column2 的 "Value" 属性 进行比较。
public class GenericProperty : INotifyPropertyChanged
{
public GenericProperty(string name, object value)
{
Name = name;
Value = value;
}
public string Name { get; private set; }
public object Value { get; set; }
DataGridCell
的 DataContext
是 DataGridRow
中显示的记录(项目)。因此,您所要做的就是比较第二个 Column
.
<DataTrigger Binding="{Binding secondColumnProp}" value="True">
<Setter Property="Background" Value="Yellow"/>
</DataTrigger>
用户评论后更新#1
您必须使用 DataGridCell
的 Loaded
事件,因为届时将评估绑定。
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<EventSetter Event="Loaded" Handler="DataGridCell_Loaded"/>
</Style>
</DataGrid.CellStyle>
void DataGridCell_Loaded(object sender, RoutedEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
DependencyObject reference = cell;
while (reference.GetType() != typeof(DataGridRow))
reference = VisualTreeHelper.GetParent(reference);
DataGridRow row = reference as DataGridRow;
while (reference.GetType() != typeof(DataGrid))
reference = VisualTreeHelper.GetParent(reference);
DataGrid grid = reference as DataGrid;
FrameworkElement elem = grid.Columns[2].GetCellContent(row);
// use elem.DataContext, or traverse elem's visualtree to do something
// code below is just an example
if (elem is TextBlock)
{
System.Diagnostics.Debug.WriteLine((elem as TextBlock).Text);
if ((elem as TextBlock).Text == "34")
cell.Background = Brushes.DarkMagenta;
}
}
经过大量努力寻找更简单、更直接的解决方案...我最终向我的对象添加了一个 属性 作为占位符来识别匹配值:
public GenericProperty(string name, object value, string match)
{
Name = name;
Value = value;
** Match = match; **
}
public string Name { get; private set; }
public object Value { get; set; }
public string Match { get; set; }
然后我有一个循环遍历我的集合的方法,并将我的新 属性 的值设置为 "true" 以匹配我的 "column 2" 项目:
private void IdentifyMatchingItems(ObservableCollection<GenericObject> groupedCollection)
{
foreach (var collectionObject in groupedCollection)
{
int x = collectionObject.Properties.Count;
int propertyCount = x - 1;
string masterValue = collectionObject.Properties[2].Value.ToString();
// string ObjectNotNull = collectionObject.Properties[propertyNumber].Value.ToString();
for (int i = 2; i <= propertyCount; i++)
{
if (collectionObject.Properties[i].Value.Equals(masterValue))
{
collectionObject.Properties[i].Latest = "yes";
}
}
}
}
最后,我有一个数据触发器,它根据 "Match" 属性.
设置我的 dataGrid 单元格的样式