WPF 中 MultiConverter ——XAML中复杂传参方式
1. XAML代码
<!-- 数据库表格 -->
<!-- RowHeaderWidth="0": 把默认的行表头隐藏 -->
<DataGrid
x:Name="xDataGrid"
Grid.Row="2"
hc:DataGridAttach.ShowRowNumber="True"
ItemsSource="{Binding WaferInfos, Mode=TwoWay}"
RowDetailsVisibilityMode="VisibleWhenSelected"
RowHeaderWidth="0"
RowStyle="{StaticResource DataGridRowStyle1}"
SelectedIndex="{Binding SelectIndex_WaferInfo, Mode=TwoWay}"
SelectedItem="{Binding SelectItem_WaferInfo, Mode=TwoWay}"
Style="{StaticResource DataGridStyle}"
VirtualizingPanel.IsVirtualizing="True">
<DataGrid.Columns>
<!-- Index -->
<DataGridTemplateColumn Header="Index" HeaderStyle="{StaticResource DataGridHeaderStyleLeft}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock x:Name="xRowIndex" Padding="10">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource RowIndexConveter}">
<!-- DataGrid 的 DataContext 是 UserControl中定义的 DataContext,-->
<!-- DataGridColumns 的 DataContext 是 ItemeSource 绑定的元素。-->
<!-- 所以在 DataGridColumns 中要使用 UserControl 中的属性,需要改变 DataContext -->
<!-- 通过 RelativeResource 向上查找 DataContext -->
<Binding Path="Header" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" />
<!-- 通过 ElementName 直接定位 控件的 DataContext -->
<Binding ElementName="xDataGrid" Path="DataContext.CurPageNum" />
<!--<Binding Path="DataContext.CurPageNum" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}"/>-->
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
2. Converter实现
public class RowIndexConveter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
int index = System.Convert.ToInt32(values[0]);
int curPageNum = System.Convert.ToInt32(values[1]);
return (index + (curPageNum - 1) * 100).ToString();
throw new NotImplementedException();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
3. 注意事项
(1)Converter 分常规 IValueConverter 和 IMultiValueConverter。区别则是传参不一样。
(2)ConverterParameter 只能赋值字符串,不能Binding。
(3)DataGrid 的 DataContext 是 UserControl中定义的 DataContext。而下面 DataGridColumns 的 DataContext 是 ItemeSource 绑定的元素,所以下面如果要使用 UserControl 中的属性,需要改变 DataContext。