当前位置: 首页 > article >正文

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。


http://www.kler.cn/a/401846.html

相关文章:

  • fastapi 调用ollama之下的sqlcoder模式进行对话操作数据库
  • 【微软:多模态基础模型】(5)多模态大模型:通过LLM训练
  • java8 快捷方式
  • WPF MVVM框架
  • 人工智能与自动驾驶:从梦想到现实
  • 鸿蒙next版开发:拍照实现方案(ArkTS)
  • 推荐一款UI/UX原型设计工具:Icons8 Lunacy
  • 【Rust 学习笔记】Rust 安装与 “Hello World” 程序介绍
  • qt中ctrl+鼠标左键无法进入
  • MFC图形函数学习09——画多边形函数
  • 【小程序】dialog组件
  • PHP批量操作加锁
  • CSP/信奥赛C++语法基础刷题训练(16):洛谷P5731:蛇形方阵
  • C++11——异常
  • 网络安全检测技术
  • python用哈希删除文件夹中重复的图片
  • linux配置动态ip
  • 网络--网络层协议--IP
  • ARM CCA机密计算安全模型之生态
  • hhdb数据库介绍(9-24)
  • SpringBoot 增量部署发布(第2版)
  • Leetcode 寻找峰值
  • flink StreamGraph 构造flink任务
  • Blender vs 3dMax谁才是3D软件的未来?
  • 【Unity踩坑】Unity编辑器占用资源过高
  • SSH公钥有什么用?Windows 11操作系统上如何获取SSH公钥