我有这个转换器,它需要:当前的 DataGridCell,一个 DataGridCellInfo 对象,我也试图在其中获取 DataGrid 对象。
<Style TargetType="{x:Type DataGridCell}" x:Key="cellStyle" >
<Setter Property="helpers:SearchBehaviours.IsTextMatchFocused">
<Setter.Value>
<MultiBinding Converter="{StaticResource SelectedSearchValueConverter}" FallbackValue="False">
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
<Binding Source="{x:Static helpers:MyClass.Instance}" Path="CurrentCellMatch" />
<Binding ElementName="GenericDataGrid"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
尝试如下绑定 DataGrid,但是当它被虚拟化并且向下滚动并且项目被回收时,它会丢弃绑定并引发错误。
System.Windows.Data 警告:4:找不到与引用“ElementName = GenericDataGrid”绑定的源。绑定表达式:路径=;数据项=空;目标元素是'DataGridCell'(名称='');目标属性是“IsTextMatchFocused”(类型“布尔”)
在下面的转换器中,DataGridCell 被转换为 DataGridCellInfo,我基本上是在比较两个 DataGridCellInfo 的行和列索引以查看它们是否匹配,如果匹配则返回 true。
为此,我需要 DataGrid 对象。我可以看到 3 种可能的解决方案:
1. 也许我可以只比较两个 DataGridCellInfo 对象来查看它们是否相同,而不必使用 DataGrid 对象。(我已经尝试过,但它总是返回 false)
2. 从 DataGridCellInfo 对象之一获取实际的 DataGrid,因为它是父对象。(不知道该怎么做)。
3. 让绑定以不同的方式工作。
显然,只要其中一个绑定发生变化,这个转换器就会为多个单元运行,所以我希望它尽可能高效。
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
try
{
if (values[0] == null || values[1] == null || values[2] == null)
{
return false;
}
DataGridCellInfo currentCellInfoMatch = (DataGridCellInfo)values[1];
if (currentCellInfoMatch.Column == null)
return false;
DataGridCellInfo cellInfo = new DataGridCellInfo((DataGridCell)values[2]);
if (cellInfo.Column == null)
return false;
DataGrid dg = (DataGrid)values[3];
int cellInfoItemIndex = ((DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(cellInfo.Item)).GetIndex();
int cellInfoColumnIndex = cellInfo.Column.DisplayIndex;
int currentCellInfoMatchItemIndex = ((DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(currentCellInfoMatch.Item)).GetIndex();
int currentCellInfoMatchColumnIndex = currentCellInfoMatch.Column.DisplayIndex;
if (cellInfoItemIndex == currentCellInfoMatchItemIndex && cellInfoColumnIndex == currentCellInfoMatchColumnIndex)
return true;
return false;
}
catch (Exception ex)
{
Console.WriteLine("SelectedSearchValueConverter error : " + ex.Message);
return false;
}
}