我拥有的是一个具有IsReadOnly属性的对象。如果此属性为true,我想将按钮上的IsEnabled属性设置为false(例如)。
我愿意相信我可以像IsEnabled="{绑定路径=!IsReadOnly}”,但这与WPF不兼容。
我是否不得不经历所有的样式设置?对于将一个bool值设置为另一个bool值的倒数这样简单的事情来说,似乎太啰嗦了。
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
我遇到了一个倒置的问题,但是有一个简洁的解决方法。
动机是XAML设计器会显示一个空控件,例如当没有数据上下文/没有MyValues (itemssource)时。
初始代码:当MyValues为空时隐藏控件。
改进的代码:当MyValues为非空或空时显示控制。
当然,问题是如何表达“1个或多个项目”,这与0个项目相反。
<ListBox ItemsSource={Binding MyValues}">
<ListBox.Style x:Uid="F404D7B2-B7D3-11E7-A5A7-97680265A416">
<Style TargetType="{x:Type ListBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding MyValues.Count}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Style>
</ListBox>
我通过添加:
<DataTrigger Binding="{Binding MyValues.Count, FallbackValue=0, TargetNullValue=0}">
因此,为绑定设置默认值。当然,这并不适用于所有类型的逆问题,但帮助我用干净的代码。
这个方法也适用于可为空的bool。
[ValueConversion(typeof(bool?), typeof(bool))]
public class InverseBooleanConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType != typeof(bool?))
{
throw new InvalidOperationException("The target must be a nullable boolean");
}
bool? b = (bool?)value;
return b.HasValue && !b.Value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return !(value as bool?);
}
#endregion
}
对于标准绑定,您需要使用看起来有点风的转换器。所以,我建议你看看我的CalcBinding项目,它是专门解决这个问题和其他一些问题而开发的。使用高级绑定,您可以直接在xaml中编写带有许多源属性的表达式。比如,你可以这样写:
<Button IsEnabled="{c:Binding Path=!IsReadOnly}" />
or
<Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/>
or
<Label Content="{c:Binding A+B+C }" />
or
<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" />
其中A, B, C, IsChecked - viewModel的属性,它将正常工作
我遇到了一个倒置的问题,但是有一个简洁的解决方法。
动机是XAML设计器会显示一个空控件,例如当没有数据上下文/没有MyValues (itemssource)时。
初始代码:当MyValues为空时隐藏控件。
改进的代码:当MyValues为非空或空时显示控制。
当然,问题是如何表达“1个或多个项目”,这与0个项目相反。
<ListBox ItemsSource={Binding MyValues}">
<ListBox.Style x:Uid="F404D7B2-B7D3-11E7-A5A7-97680265A416">
<Style TargetType="{x:Type ListBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding MyValues.Count}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Style>
</ListBox>
我通过添加:
<DataTrigger Binding="{Binding MyValues.Count, FallbackValue=0, TargetNullValue=0}">
因此,为绑定设置默认值。当然,这并不适用于所有类型的逆问题,但帮助我用干净的代码。