False일 때 축소된 대신 숨김으로 변환하는 WPF BooleanToVisibilityConverter?
기존 WPF BooleanToVisibilityConverter를 사용하지만 False 값을 기본 Closed가 아닌 Hidden으로 변환하는 방법이 있습니까? 아니면 내가 직접 작성해야 합니까?저는 이와 같은 간단한 작업(공유된 작업은 별도의 솔루션에 포함되며, 재구축/체크인/합병 프로세스는 프로세스의 과도한 변형된 거대 프로세스임)을 수행하는 데 엄청난 오버헤드가 발생하는 프로젝트에 참여하고 있습니다. 따라서 방금 언급한 후프를 건너뛰는 것보다 기존 프로세스에 매개 변수를 전달할 수 있으면 좋겠습니다.
이에 대한 가장 간단하고 최상의 해결책을 찾았습니다.
[ValueConversion(typeof(bool), typeof(Visibility))]
public sealed class BoolToVisibilityConverter : IValueConverter
{
public Visibility TrueValue { get; set; }
public Visibility FalseValue { get; set; }
public BoolToVisibilityConverter()
{
// set defaults
TrueValue = Visibility.Visible;
FalseValue = Visibility.Collapsed;
}
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (!(value is bool))
return null;
return (bool)value ? TrueValue : FalseValue;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (Equals(value, TrueValue))
return true;
if (Equals(value, FalseValue))
return false;
return null;
}
}
사용할 때 다음과 같이 XAML에서 필요한 작업을 수행하는 버전을 구성하면 됩니다.
<Blah.Resources>
<local:BoolToVisibilityConverter
x:Key="BoolToHiddenConverter"
TrueValue="Visible" FalseValue="Hidden" />
</Blah.Resources>
그런 다음 다음과 같은 하나 이상의 바인딩에서 사용합니다.
<Foo Visibility="{Binding IsItFridayAlready,
Converter={StaticResource BoolToHiddenConverter}}" />
이 간단한 솔루션은 숨겨진/파손된 선호도를 해결하고 효과를 반전/부정합니다.
SilverLIGHT 사용자는 다음 항목을 삭제해야 합니다.[ValueConversion]해당 특성이 Silverlight 프레임워크의 일부가 아님을 선언합니다.WPF에서도 꼭 필요한 것은 아니지만 내장형 변환기와 일치합니다.
안타깝게도 표시 또는 접힘으로만 변환되므로 사용자가 직접 작성해야 합니다.Reflector에 따른 변환 방법은 다음과 같습니다.
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = false;
if (value is bool)
{
flag = (bool)value;
}
else if (value is bool?)
{
bool? nullable = (bool?)value;
flag = nullable.HasValue ? nullable.Value : false;
}
return (flag ? Visibility.Visible : Visibility.Collapsed);
}
변환기 대신 스타일만 사용할 수는 없나요?코드는 다음과 같습니다.
<Style x:Key="Triggers" TargetType="Button">
<Style.Triggers>
<Trigger Property="{Binding ...}" Value="false">
<Setter Property = "Visibility" Value="Hidden"/>
</Trigger>
</Style.Triggers>
</Style>
Bool 속성을 가리키기 위해 속성 바인딩을 제공해야 합니다.
나는 가시성 로직을 반전시키기 위해 파라미터를 사용하는 것을 좋아합니다.논리를 반대로 하려면 간단히 말해서, xaml 코드에 ConverterParameter=ParameterreverseFacebook을 입력합니다.
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = false;
if (value is bool)
{
flag = (bool)value;
}
var reverse = parameter as string;
if(reverse != null && reverse == "Reverse")
flag != flag;
return (flag ? Visibility.Visible : Visibility.Collapsed);
}
매개 변수에서 보이지 않는 상태를 전달할 수 있는 BoolToVisibilityConverte를 작성했습니다.
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var boolValue = (bool) value;
return boolValue ? Visibility.Visible : (parameter ?? Visibility.Hidden);
}
따라서 다음과 같이 바인딩할 수 있습니다.
Visibility="{Binding SomeBool, Converter={StaticResource ResourceKey=BooleanToVisibilityConverter}, ConverterParameter={x:Static Visibility.Collapsed}}"
이것이 도움이 되길 바랍니다 :)
저는 이 문제를 제기했고 제 해결책은 아마도 매우 상황적이었지만 어쨌든 공유하겠습니다.제 상황 때문에 변환기 없이 간단한 코드로 변환기를 모방할 수 있었습니다.텍스트 상자에 바인딩된 변수가 숫자 상자(숫자를 확인하기 위해 정규식을 통해)가 0이 아닌 경우에만 가시성이 변경되었습니다.이에 대한 전체 코드는 아래에 있지만 코드의 다른 곳에서 부울을 변경하려면 WPF와 C#의 첫 번째 비트만 있으면 됩니다. wpf:
Visibility="{Binding Path=Visible}"
C#
public class foo : INotifyPropertyChanged
{
private bool vis = false;
public object Visible
{
get
{
if (vis == true)
{
return Visibility.Visible;
}
else
{
return Visibility.Hidden;
}
}
set
{
vis = (bool)value;
OnPropertyChanged(nameof(Visible));
}
}
public int Value_b
{
get
{
return base_value;
}
set
{
base_value = value;
OnPropertyChanged(nameof(Value_b));
if (base_value == 0)
{
Visible = false;
}
else
{
Visible = true;
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(propertyName));
}
}
보정 사용.Micro, 저는 제 단순한 사용 사례와 다른 사용자를 위해 작동하는 다음 코드를 가지고 있습니다.
내 보기에는 변수 중 하나에 양의 길이 문자열이 없는 경우 숨기려는 단추가 있습니다.
<Button x:Name="SelectBinaryFilePath" Content="Select" Visibility="{Binding CanSelectBinaryFile}" />
내 View 모델에는 다음 속성이 있습니다.
public Visibility CanSelectBinaryFile
{
get
{
return String.IsNullOrEmpty(FileSystemPath) ? Visibility.Hidden : Visibility.Visible;
}
}
다음 작업을 수행합니다.NotifyOfPropertyChange확실하게 하기 위해CanSelectBinaryFile소품이 업데이트되었습니다.
언급URL : https://stackoverflow.com/questions/3128023/wpf-booleantovisibilityconverter-that-converts-to-hidden-instead-of-collapsed-wh
'programing' 카테고리의 다른 글
| (Firebase에서) Google-services.json을 저장소에 추가해야 합니까? (0) | 2023.06.11 |
|---|---|
| 절: Mysql 업데이트 쿼리에서 알 수 없는 열 (0) | 2023.06.11 |
| 미리 정의된 Oracle pl/SQL 예외의 전체 목록은 어디에서 찾을 수 있습니까? (0) | 2023.06.11 |
| 여러 줄 텍스트 상자의 최대 길이 지정 (0) | 2023.06.11 |
| .NET에서 SSIS 패키지를 실행하는 방법은 무엇입니까? (0) | 2023.06.11 |