复选框缺陷的可绑定属性不反映何时使用触发器

时间:2016-02-24 11:06:47

标签: wpf checkbox triggers

我们在触发器中设置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。

1 个答案:

答案 0 :(得分:0)

问题在于<Setter Property="IsChecked" Value="False"></Setter>会清除原始绑定,因此CheckBox的{​​{1}}属性最终会变为IsChecked,而不会更改基础属性。

您提到您有一个viewmodel,我认为FalseChkExportToCSV 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

诀窍在于trueRevalSurfaceCheckboxEnableConverter的设定者:

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移到了这里。这应该可以解决您的问题。我测试过它对我有用。