我询问binding to a control并了解到我可以绑定到ElementName。所以我做了。但是,我注意到我需要恢复被选中的值。有没有办法在没有转换器的情况下做到这一点?
<DatePicker Name="EndDate"
Text="{Binding Path=EndDate}"
IsEnabled="{Binding ElementName=NoEnd,Path=IsChecked}" />
<CheckBox Name="NoEndDate"
Checked="Checked"
Unchecked="Unchecked" />
我希望在 NoEndDate 的路径为false时设置为启用,反之亦然。
答案 0 :(得分:2)
您可以将自定义样式与DataTrigger
一起使用。这实现了你想要的,但使用转换器不是更容易吗?
<DatePicker Name="EndDate" Text="{Binding Path=EndDate}">
<DatePicker.Style>
<Style TargetType="{x:Type DatePicker}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=NoEndDate, Path=IsChecked}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DatePicker.Style>
</DatePicker>
<CheckBox Name="NoEndDate"/>
答案 1 :(得分:1)
简短的回答是
只要您想要绑定到 所需值的东西,就需要转换器。
答案 2 :(得分:1)
如果你想将转换一个布尔值从true变为false,反之亦然,你需要一个转换器,是的。这正是转换器在WPF中的用途。
我知道你对转换器很熟悉但只是为了完成这个帖子,用下面的Convert方法创建一个InverseBooleanConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType != typeof(bool) && targetType != typeof(bool?))
throw new InvalidOperationException("The targetType must be a bool!");
if (value == null)
return null;
return !(bool)value;
}
对ConvertBack方法执行相同操作。
您的XAML代码应如下所示:
<DatePicker Name="EndDate"
Text="{Binding Path=EndDate}"
IsEnabled="{Binding ElementName=NoEnd, Path=IsChecked, Converter={StaticResource InverseBooleanConverter}}“ />
<CheckBox Name="NoEndDate"
Checked="Checked"
Unchecked="Unchecked" />
答案 3 :(得分:1)
XAML在绑定时没有对内联布尔表达式的开箱即用支持。
有点谷歌搜索确实出现QuickConverter。
不能说我已经尝试过了,但应该让你write code like this:
<CheckBox IsEnabled="{qc:Binding '!$P', P={Binding Path=ViewModel.SomeBooleanProperty}}" />
答案 4 :(得分:1)
下面的代码将为您完成工作。如果禁用CheckBox,它将启用Button,反之亦然。而且我经常使用这种方法,因为我发现它比使用动画和转换器容易。 它使用Blend SDK中提供的ChangePropertyAction行为。
<CheckBox x:Name="checkBox" Content="CheckBox" HorizontalAlignment="Right" Margin="0,171,147,0" VerticalAlignment="Top">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked" SourceObject="{Binding ElementName=checkBox}">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=button2}" PropertyName="IsEnabled"/>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=button2}" PropertyName="IsEnabled" Value="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
<Button x:Name="button2" Content="Button" HorizontalAlignment="Right" Margin="0,145,140,0" VerticalAlignment="Top" Width="75"/>
就是这样,你不知道如何让它为你工作:
一个。包括以下命名空间:
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
B中。添加对Microsoft.Expression.Interactions
,System.Windows.Interactivity
的引用
在我的系统上,这些可以在
C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries