随笔 - 23  文章 - 0  评论 - 3  阅读 - 30242

MvvmLight中,两个依赖属性的值发生变化时影响第三个控件属性的用法

  1. 使用数据绑定配合IValueConverter(值转换器)

创建一个自定义转换器,该转换器接收两个输入值,并根据他们是否相等返回相应的输出值。然后将这个转换器应用到第三个控件的属性上

复制代码
 1 public class EqualityToTextConverter : IValueConverter
 2 {
 3     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
 4     {
 5         string value1 = (string)values[0];
 6         string value2 = (string)values[1];
 7 
 8         return value1 == value2 ? "Equal" : "Not Equal"; // 根据需要返回不同的文本
 9     }
10 
11     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
12     {
13         throw new NotSupportedException("EqualityToTextConverter只支持单向转换");
14     }
15 }
复制代码

在XAML中使用MultiBinding:

复制代码
 1 <Window.Resources>
 2     <local:EqualityToTextConverter x:Key="EqualityConverter"/>
 3 </Window.Resources>
 4 
 5 <!-- 假设这两个依赖属性都在同一个ViewModel中 -->
 6 <Grid DataContext="{Binding RelativeSource={RelativeSource Self}}">
 7     <TextBox Text="{Binding Property1}" />
 8     <TextBox Text="{Binding Property2}" />
 9 
10     <!-- 第三个TextBox -->
11     <TextBox>
12         <TextBox.Text>
13             <MultiBinding Converter="{StaticResource EqualityConverter}">
14                 <Binding Path="Property1" />
15                 <Binding Path="Property2" />
16             </MultiBinding>
17         </TextBox.Text>
18     </TextBox>
19 </Grid>
复制代码

 

使用命令或事件触发逻辑: 在ViewModel中创建一个命令,当两个属性值改变时执行此命令,命令内部比较两个属性并更新第三个TextBox的Text属性。

复制代码
 1 public class MyViewModel : ViewModelBase
 2 {
 3     private string property1;
 4     public string Property1
 5     {
 6         get { return property1; }
 7         set
 8         {
 9             if (property1 != value)
10             {
11                 property1 = value;
12                 RaisePropertyChanged(nameof(Property1));
13                 CheckEquality();
14             }
15         }
16     }
17 
18     private string property2;
19     public string Property2
20     {
21         get { return property2; }
22         set
23         {
24             if (property2 != value)
25             {
26                 property2 = value;
27                 RaisePropertyChanged(nameof(Property2));
28                 CheckEquality();
29             }
30         }
31     }
32 
33     private void CheckEquality()
34     {
35         if (Property1 != Property2)
36         {
37             ThirdProperty = "Not Equal";
38         }
39         else
40         {
41             ThirdProperty = "Equal";
42         }
43     }
44 
45     private string thirdProperty;
46     public string ThirdProperty
47     {
48         get { return thirdProperty; }
49         set
50         {
51             if (thirdProperty != value)
52             {
53                 thirdProperty = value;
54                 RaisePropertyChanged(nameof(ThirdProperty));
55             }
56         }
57     }
58 }
59 
60 <!-- XAML -->
61 <TextBox Text="{Binding Property1}" />
62 <TextBox Text="{Binding Property2}" />
63 <TextBox Text="{Binding ThirdProperty}" />
复制代码

 

posted on   赵书记  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示