我们在触发器中设置RevalSurfaceChecked
属性时,我的可绑定属性IsChecked
不会更新
<CheckBox Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" x:Name="chkRevalSurface" Content="Export Reval Surface (if applicable)"
HorizontalAlignment="Left" VerticalAlignment="Center">
<CheckBox.IsEnabled>
<MultiBinding Converter="{StaticResource RevalSurfaceCheckboxEnableConverter}">
<Binding ElementName="ChkExportToCSV" Path="IsChecked"></Binding>
<Binding ElementName="chkExportToExcel" Path="IsChecked"></Binding>
</MultiBinding>
</CheckBox.IsEnabled>
<CheckBox.Style>
<Style TargetType="{x:Type CheckBox}">
<Setter Property="IsChecked" Value="{Binding RevalSurfaceChecked}" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="IsChecked" Value="False"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
这里的逻辑是,如果我检查两个复选框中的任何一个,那么chkRevalSurface
应该被启用,否则保持禁用 - 写入转换器。禁用chkRevalSurface
时,应设置为未选中(写入触发器),RevalSurfaceChecked
属性应设置为False
。如果选中,则在viewmodel中将其设置为True
。
但RevalSurfaceChecked
未设为true或false。
答案 0 :(得分:0)
问题在于<Setter Property="IsChecked" Value="False"></Setter>
会清除原始绑定,因此CheckBox
的{{1}}属性最终会变为IsChecked
,而不会更改基础属性。
您提到您有一个viewmodel,我认为False
和ChkExportToCSV
chkExportToExcel
es绑定到您的viewmodel中的属性。
让我们假设这个视图模型:
CheckBox
这个XAML:
public class MainWindowViewModel : INotifyPropertyChanged
{
private bool _revalSurfaceChecked;
public bool RevalSurfaceChecked
{
get { return _revalSurfaceChecked; }
set
{
_revalSurfaceChecked = value;
OnPropertyChanged();
}
}
private bool _isChkExportToCSVChecked;
public bool IsChkExportToCSVChecked
{
get { return _isChkExportToCSVChecked; }
set
{
_isChkExportToCSVChecked = value;
RevalSurfaceChecked = RevalSurfaceChecked && (_isChkExportToCSVChecked || _ischkExportToExcelChecked);
OnPropertyChanged();
}
}
private bool _ischkExportToExcelChecked;
public bool IschkExportToExcelChecked
{
get { return _ischkExportToExcelChecked; }
set
{
_ischkExportToExcelChecked = value;
RevalSurfaceChecked = RevalSurfaceChecked && (_isChkExportToCSVChecked || _ischkExportToExcelChecked);
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我将<CheckBox x:Name="ChkExportToCSV" Content="ChkExportToCSV" IsChecked="{Binding IsChkExportToCSVChecked}"
HorizontalAlignment="Left" VerticalAlignment="Center" />
<CheckBox x:Name="chkExportToExcel" Content="chkExportToExcel" IsChecked="{Binding IschkExportToExcelChecked}"
HorizontalAlignment="Left" VerticalAlignment="Center" />
<CheckBox x:Name="chkRevalSurface" Content="Export Reval Surface (if applicable)"
HorizontalAlignment="Left" VerticalAlignment="Center"
IsChecked="{Binding RevalSurfaceChecked}">
<CheckBox.IsEnabled>
<MultiBinding Converter="{StaticResource AnyTrueConverter}">
<Binding ElementName="ChkExportToCSV" Path="IsChecked"></Binding>
<Binding ElementName="chkExportToExcel" Path="IsChecked"></Binding>
</MultiBinding>
</CheckBox.IsEnabled>
</CheckBox>
的{{1}}属性绑定到viewmodel中的ChkExportToCSV
属性,将IsChecked
的{{1}}绑定到IsChkExportToCSVChecked
1}}属性。
我从chkExportToExcel
移除了IsChecked
,而对于IschkExportToExcelChecked
,如果任何输入为Style
,我会使用转换回chkRevalSurface
的转换器。我假设你的IsEnabled
做同样的事情,但我会在此处加入:
true
诀窍在于true
和RevalSurfaceCheckboxEnableConverter
的设定者:
public class AnyTrueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values != null && values.OfType<bool>().Any(b => b);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我们将逻辑从IsChkExportToCSVChecked
移到了这里。这应该可以解决您的问题。我测试过它对我有用。