在实际的开发中,经常会有这样的需要,当一个属性变化时,需要其他属性一起联动发生变化。这种变化如果只是后台之间属性之间的约束,直接写在后台代码中也无所谓,甚至可以说是这样组织是一个不错的策略。
但是,如果这种变化只体现在界面的联动效果上,比如属性A的变化,影响到属性B在界面上是否可以编辑。在这种场景中,如果后台代码过分干预前台的显示效果,反而显得设计过于耦合了。我们可以把这种变化,通过转换器在前台实现控制。WPF的转换器分为单值转换器,和多值转换器。既然是属性变化影响的是其他属性的先关显示,这样的情况使用单值转换器就很难起到灵活监控属性变化的作用了。这里就引入了多值转换器。
1、实现一个多值转换器,继承IMultiValueConverter
/// <summary>
/// 楼层面积是否可用
/// </summary>
public class FloorAreaEnableConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
try
{
if (values == null || !values.Any())
return false;
BuildingFunction function = values[0] as BuildingFunction;
if (function == null)
return false;
var enable = function.ElevationRange != null && function.ElevationRange.ToString() == ">24m";
if (!enable&&!string.IsNullOrWhiteSpace(function.FloorArea))
function.FloorArea = string.Empty;
return enable;
}
catch (Exception)
{
return false;
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
2、在WPF前台界面对定义的多值转换器进行使用
<ComboBox.IsEnabled>
<MultiBinding Converter="{StaticResource FloorAreaEnable}">
<Binding ></Binding>
<Binding Path="ElevationRange"></Binding>
<Binding Path="FloorArea"></Binding>
</MultiBinding>
</ComboBox.IsEnabled>