programing

WPF 라디오 버튼(2)(부울 값에 바인딩)

oldcodes 2023. 4. 14. 22:06
반응형

WPF 라디오 버튼(2)(부울 값에 바인딩)

확인란이 표시된 boolean 형식의 속성이 있습니다.

같은 속성에 바인딩되어 true/false 값을 나타내는2개의 무선버튼으로 변경합니다.

어떻게 그럴 수 있죠?

<RadioButton GroupName="Group1" 
             IsChecked="{Binding PropertyValue}" Content="Yes" />
<RadioButton GroupName="Group1"  Content="No" 
             IsChecked="{Binding PropertyValue, 
                         Converter={StaticResource BoolInverterConverter}}" />
public class BoolInverterConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !(bool)value;
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
        System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !(bool)value;
        }
        return value;
    }

    #endregion
}

표준 바인딩 방식에서는 UI가 로드될 때마다 바인딩 세터를 "선택되지 않음"으로 부팅하는 부작용이 있습니다.셋터에서 사용자의 부울 클릭을 처리하는 코드가 있으면 셋터를 "진정한" 부울에 묶어서 "거짓"으로 만드는 것과 같은 이상한 일을 하게 됩니다.

라디오 버튼 전용 컨버터를 사용하여 이 문제를 해결했습니다.

public class BoolRadioConverter : IValueConverter
{
    public bool Inverse { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolValue = (bool) value;

        return this.Inverse ? !boolValue : boolValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolValue = (bool)value;

        if (!boolValue)
        {
            // We only care when the user clicks a radio button to select it.
            return null;
        }

        return !this.Inverse;
    }
}

리소스:

<converters:BoolRadioConverter x:Key="BoolRadioConverter" />
<converters:BoolRadioConverter x:Key="InverseBoolRadioConverter" Inverse="True" />

xaml:

<RadioButton
    Content="True option"
    GroupName="radioGroup1"
    IsChecked="{Binding MyProperty,
                        Converter={StaticResource BoolRadioConverter}}" />
<RadioButton
    Content="False option"
    GroupName="radioGroup2"
    IsChecked="{Binding MyProperty,
                        Converter={StaticResource InverseBoolRadioConverter}}" />

부울값을 되돌리는 값 변환기를 사용할 수 있습니다.

이 변환기를 사용하여 하나의 확인란을 바인딩합니다.IsChecked-property는 변환기와 CheckBox를 사용하지 않고 부울값으로 설정합니다.IsChecked-property는 컨버터를 사용합니다.이거면 될 거야.

여기 이러한 변환기의 코드가 있습니다.여기서 복사해서 코드 몇 줄을 추가했어요.자세한 내용은 이쪽에서 확인하실 수 있습니다.

public class BoolToOppositeBoolConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) {
        if (targetType != typeof(bool)) {
            throw new InvalidOperationException("The target must be a boolean");
        }
        if (null == value) {
            return null;
        }
                    return !(bool)value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) {
        if (targetType != typeof(bool)) {
            throw new InvalidOperationException("The target must be a boolean");
        }
        if (null == value) {
            return null;
        }
        return !(bool)value;
    }
} 

사용하려면 [Resource]섹션에서 선언합니다.

 <local:BoolToOppositeBoolConverter x:Key="BoolToOppositeBoolConverter_ValueConverter"/>

바인딩에서 정적 리소스로 사용:

<CheckBox IsChecked="{Binding YourProperty}" />
<CheckBox IsChecked="{Binding YourProperty,Converter={StaticResource BoolToOppositeBoolConverter_ValueConverter}}" />

컨버터는 단순한 예에 불과합니다.생산적인 코드로 사용하고 싶은 경우는, 깔끔하게 실장해 주세요.테스트 안 해봤어요.안 되면 댓글 달아주세요.

2개의 옵션버튼의 GroupName 속성을 같은 값으로 설정하면 컨버터 없이 이를 실행할 수 있습니다(따라서 동시에 체크할 수 있는 것은 1개뿐입니다).그런 다음 하나의 옵션버튼의 IsChecked를 True로 설정하고 다른 옵션버튼의 IsChecked를 Boolean에 바인드합니다.옵션 버튼을 전환하면 부울 값이 변경되지만 부울 값을 False로 변경해도 다른 옵션버튼은 체크되지 않습니다.

고마워요, 블라드

다음으로 샘플 코드를 사용하여 임의의 유형(열, 부울, 문자열, 정수 등)에 라디오버튼을 바인드하는 방법을 나타냅니다.

http://www.codeproject.com/Tips/720497/Binding-Radio-Buttons-to-a-Single-Property

사용시MVVMLight그리고.DataContext는, XAML 로 다음과 같이 설정됩니다.

DataContext="{Binding <Your ViewModel property name>, Source={StaticResource Locator}}" 

BoolInverterConverter원인들Stack Overflow두 번째로 창문을 열었을 때요.

이 문제를 해결하려면DataContext에서 XAML 뒤에 있는 윈도 합니다.InitializeComponent():

DataContext = ServiceLocator.Current.GetInstance<Your View Model class>();

테스트 후로는 충분하지 않았습니다.옵션 버튼을 클릭하면 스택 오버플로 에러가 랜덤으로 표시됩니다.나에게 효과가 있었던 솔루션은 컨버터 대신 그룹의 다른 라디오 버튼에 다른 속성을 사용합니다.

public bool Is9to1 { get; set; }
public bool Is1to9 { get { return !Is9to1; } set { Is9to1 = !value; } } 

XAML의 경우:

   <RadioButton GroupName="Is9to1" IsChecked="{Binding Is1to9}"/>
   <RadioButton GroupName="Is9to1" IsChecked="{Binding Is9to1}"/>

라구나단답변을 단순화한 것입니다.

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) =>
    Convert(value);

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) =>
    Convert(value);

private object Convert(object value) => 
    value is bool ? !(bool)value : value;

부울을 무효로 하는 경우는, Random Engy 의 회답의 업그레이드를 거의 실시하지 않습니다(디폴트값 없음/체크된 라디오 버튼).

public class BoolRadioConverter : IValueConverter
{
    public bool Inverse { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool? boolValue = (bool?)value;

        return this.Inverse ? !boolValue : boolValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool? boolValue = (bool?)value;

        if (boolValue != null && (bool)!boolValue)
        {
            // We only care when the user clicks a radio button to select it.
            return null;
        }

        return !this.Inverse;
    }
}

그리고 나머지는 그의 대답과 같다.

의 답변:Mr-RandomQC을 사용하다하지만 같은 그룹의 다른 라디오를 클릭할 수 있습니다.그러면 반대편 라디오에 라디오 버튼 주위에 빨간색 상자가 표시됩니다.

는 그의 돌려보냈다.Binding.DoNothing null이것처럼.

public class BoolRadioConverter : IValueConverter
{
    public bool Inverse { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolValue = (bool)value;

        return this.Inverse ? !boolValue : boolValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolValue = (bool)value;

        if (!boolValue)
        {
            // Return Binding.DoNothing instead of Return null
            return Binding.DoNothing;
        }

        return !this.Inverse;
    }
}

답변이 늦었지만 WPF에서는 몇 년째 이렇게 하고 있습니다.처음에는 Win과 함께 하고 있습니다.UI 3

<StackPanel>

<TextBlock Text="Payment terms" />

<RadioButton
    x:Name="rdo_on_account"
    Content="Account"
    GroupName="account"
    IsChecked="{x:Bind ViewModel.IsOnAccount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

<RadioButton
    Content="Cash"
    GroupName="account"
    IsChecked="{Binding ElementName=rdo_on_account, Path=IsChecked, Converter={StaticResource BoolInvert}}" />
    
</StackPanel>



public class BoolInvert : IValueConverter
{
// convert the value to the destination format
public object Convert(object value, Type targetType, object parameter, string language)
{
    if (value is bool)
    {
        if ((bool)value == true)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    //not a bool
    return value;
}

// convert from the destination format to the source format
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
    return value;
}
}

언급URL : https://stackoverflow.com/questions/3361362/wpf-radiobutton-two-binding-to-boolean-value

반응형