WPF-多个Expander联动

最近在写一点WPF的控件,说一下需求吧。

产品提出需要设计可折叠的控件,需要的时候点开,展示内容;不需要的时候,点击收起内容。其实WPF里面toolbox有expander这个控件,但是又来了个奇葩的需求:要求一次只能展开一个expander,类似radiobutton的特性,“可以且只能”选中一项。在网上搜了很多资料,不得不佩服Windows是生产力工具这句话。。。

例如:贴吧里面就提出了一种方法,让RadioButton集成Expander的模板,同时绑定RadioButton的IsChecked和Expander的IsExpanded,RadioButton的content和Expander的content(不得不佩服Windows的开发思路)。

F5运行之后,既有了Expander的特性,又兼具RadioButton的group功能,but,Expander的header没了……

有人提出说将Expander header加入到RadioButton中,说的不是很详细,然后我也是刚入门,捣腾了半天也还是不行。

接着找到了一篇博客WPF简易手风琴完美地满足了需求,而且作者提出了两种思路:Expander+listbox和上面贴吧提出的一种方法。第一种略显复杂,第二种作者也只是提了下思路,具体实现没有写出来。我不想用第一种的方法,感觉代码量太大,想着能定义好模板,然后直接在xaml里面添加控件是最方便的。搜了一晚上的Stack Overflow也没有结果。今天早上突然想起来这篇博文里面提到Tag这个属性,于是就想着把Expander的header和RadioButton的Tag绑定在一起,设置RadioButton的Tag,然后再运行,果然,Tag属性绑定到Expander的Header上了。搞定……

后面还需要多学习下Template和Style,感觉很深奥,需要慢慢体会

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 WPF MVVM 架构中,可以使用 InvokeCommandAction 来触发 ViewModel 中的命令,并且可以传递一个参数。如果需要传递多个参数,可以使用以下方法: 1. 使用命令参数对象 定义一个类,包含需要传递的多个参数,例如: ``` public class CommandParameter { public string Parameter1 { get; set; } public int Parameter2 { get; set; } } ``` 在 XAML 中,使用该类作为 InvokeCommandAction 的 CommandParameter 属性的值: ``` <i:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding CommandParameter}" /> ``` 在 ViewModel 中,命令的 Execute 方法可以接收该类的实例作为参数: ``` public RelayCommand<CommandParameter> MyCommand { get; set; } public void MyCommandExecute(CommandParameter parameter) { // 使用参数 } ``` 2. 使用触发事件的参数 在 XAML 中,可以使用 EventTrigger 触发一个事件,并且可以使用 EventTrigger 的 EventArgsConverter 属性将事件参数转换为需要的类型。例如: ``` <i:Interaction.Triggers> <i:EventTrigger EventName="MyEvent"> <i:InvokeCommandAction Command="{Binding MyCommand}"> <i:InvokeCommandAction.CommandParameter> <MultiBinding Converter="{StaticResource MyConverter}"> <Binding Path="Parameter1" /> <Binding Path="Parameter2" /> </MultiBinding> </i:InvokeCommandAction.CommandParameter> </i:InvokeCommandAction> </i:EventTrigger> </i:Interaction.Triggers> ``` 在这里,使用 MultiBinding 将多个绑定值传递给一个转换器。转换器将这些值转换为需要的类型,并且将它们封装到一个对象中,然后作为命令的参数传递给 ViewModel。 在 ViewModel 中,命令的 Execute 方法可以接收该对象作为参数: ``` public RelayCommand<MyParameter> MyCommand { get; set; } public void MyCommandExecute(MyParameter parameter) { // 使用参数 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值