WPF에서 역 부울 속성을 바인딩하는 방법은 무엇입니까?
내가 가진 것은 IsReadOnly
속성 이있는 객체입니다 . 이 속성이 true이면 IsEnabled
Button 의 속성 (예 :)을 false 로 설정하고 싶습니다 .
나는 그것을 쉽게 할 수 있다고 생각하고 IsEnabled="{Binding Path=!IsReadOnly}"
싶지만 WPF와 함께 비행하지는 않습니다.
모든 스타일 설정을 거쳐야합니까? 하나의 bool을 다른 bool의 역수로 설정하는 것만 큼 간단한 것에는 너무 경건한 것처럼 보입니다.
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
bool 속성을 반전시키는 ValueConverter를 사용할 수 있습니다.
XAML :
IsEnabled="{Binding Path=IsReadOnly, Converter={StaticResource InverseBooleanConverter}}"
변환기:
[ValueConversion(typeof(bool), typeof(bool))]
public class InverseBooleanConverter: IValueConverter
{
#region IValueConverter Members
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");
return !(bool)value;
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
#endregion
}
IsNotReadOnly
속성 을 고려 했습니까 ? 바인딩되는 객체가 MVVM 도메인의 ViewModel 인 경우 추가 속성이 완벽합니다. 직접 엔터티 모델 인 경우 엔터티의 특수한 ViewModel을 구성하고 양식에 제시 할 수 있습니다.
표준 바인딩을 사용하면 바람이 거의 부는 것처럼 보이지 않는 변환기를 사용해야합니다. 따라서이 문제와 다른 문제를 해결하기 위해 특별히 개발 된 CalcBinding 프로젝트를 보는 것이 좋습니다 . 고급 바인딩을 사용하면 많은 소스 속성이있는 표현식을 xaml에 직접 작성할 수 있습니다. 다음과 같이 쓸 수 있습니다.
<Button IsEnabled="{c:Binding Path=!IsReadOnly}" />
또는
<Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/>
또는
<Label Content="{c:Binding A+B+C }" />
또는
<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" />
where A, B, C, IsChecked-viewModel의 속성과 제대로 작동합니다
행운을 빕니다!
https://quickconverter.codeplex.com/을 사용하는 것이 좋습니다.
부울 반전은 다음과 같이 간단합니다. <Button IsEnabled="{qc:Binding '!$P', P={Binding IsReadOnly}}" />
이는 일반적으로 변환기를 작성하는 데 필요한 시간을 단축시킵니다.
XAML을 가능한 한 우아하게 유지하고 싶었으므로 공유 라이브러리 중 하나에있는 bool을 래핑하는 클래스를 만들었습니다. 암시 적 연산자는 클래스를 코드 숨김에서 부울로 완벽하게 사용할 수 있도록합니다.
public class InvertableBool
{
private bool value = false;
public bool Value { get { return value; } }
public bool Invert { get { return !value; } }
public InvertableBool(bool b)
{
value = b;
}
public static implicit operator InvertableBool(bool b)
{
return new InvertableBool(b);
}
public static implicit operator bool(InvertableBool b)
{
return b.value;
}
}
프로젝트에 필요한 유일한 변경 사항은 반전하려는 속성이 bool 대신 이것을 반환하도록하는 것입니다.
public InvertableBool IsActive
{
get
{
return true;
}
}
XAML 접두사에서 Value 또는 Invert를 사용한 바인딩
IsEnabled="{Binding IsActive.Value}"
IsEnabled="{Binding IsActive.Invert}"
이것은 nullable bool에도 적용됩니다.
[ValueConversion(typeof(bool?), typeof(bool))]
public class InverseBooleanConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType != typeof(bool?))
{
throw new InvalidOperationException("The target must be a nullable boolean");
}
bool? b = (bool?)value;
return b.HasValue && !b.Value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return !(value as bool?);
}
#endregion
}
이것이 XAML과 관련이 있는지 모르겠지만 간단한 Windows 응용 프로그램에서 바인딩을 수동으로 만들고 Format 이벤트 처리기를 추가했습니다.
public FormMain() {
InitializeComponent();
Binding argBinding = new Binding("Enabled", uxCheckBoxArgsNull, "Checked", false, DataSourceUpdateMode.OnPropertyChanged);
argBinding.Format += new ConvertEventHandler(Binding_Format_BooleanInverse);
uxTextBoxArgs.DataBindings.Add(argBinding);
}
void Binding_Format_BooleanInverse(object sender, ConvertEventArgs e) {
bool boolValue = (bool)e.Value;
e.Value = !boolValue;
}
뷰 모델에 속성을 하나 더 추가하면 역값이 반환됩니다. 그리고 버튼에 바인딩하십시오. 처럼;
뷰 모델에서 :
public bool IsNotReadOnly{get{return !IsReadOnly;}}
xaml에서 :
IsEnabled="{Binding IsNotReadOnly"}
나는 반전 문제가 있었지만 깔끔한 해결책이있었습니다.
동기는 XAML 디자이너가 예를 들어 datacontext / no MyValues
(itemssource) 가 없을 때 빈 컨트롤을 표시한다는 것 입니다.
초기 코드 : 비어있는 경우 컨트롤 숨기기 MyValues
개선 된 코드 : null 또는 비어 있지 않은 경우 제어 표시MyValues
.
물론 문제는 '1 개 이상의 항목'을 표현하는 방법인데, 이는 0 개의 항목과 반대입니다.
<ListBox ItemsSource={Binding MyValues}">
<ListBox.Style x:Uid="F404D7B2-B7D3-11E7-A5A7-97680265A416">
<Style TargetType="{x:Type ListBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding MyValues.Count}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Style>
</ListBox>
다음을 추가하여 해결했습니다.
<DataTrigger Binding="{Binding MyValues.Count, FallbackValue=0, TargetNullValue=0}">
Ergo 바인딩의 기본값을 설정합니다. 물론 이것은 모든 종류의 역 문제에는 적용되지 않지만 깨끗한 코드로 도움이되었습니다.
@Paul의 대답에 따라 ViewModel에 다음을 작성했습니다.
public bool ShowAtView { get; set; }
public bool InvShowAtView { get { return !ShowAtView; } }
나는 여기에 발췌 문장이 누군가를 도울 것입니다. 아마도 초보자입니다.
실수가 있으면 알려주세요!
BTW, @heltonbiker 의견에 동의합니다 .3 번 이상 사용할 필요가없는 경우에만 올바른 접근 방식입니다 ...
나는 매우 비슷한 것을했습니다. 데이터 검색이 완료된 경우에만 콤보 박스를 선택할 수 있도록 씬 뒤에 내 속성을 만들었습니다. 내 창이 처음 나타나면 비동기로드 명령이 시작되지만 여전히 데이터를로드하는 동안 사용자가 콤보 상자를 클릭하지 않기를 원합니다 (비어있을 때 채워짐). 따라서 기본적으로 속성은 false이므로 getter에서 역을 반환합니다. 그런 다음 검색 할 때 속성을 true로 설정하고 완료되면 다시 false로 설정합니다.
private bool _isSearching;
public bool IsSearching
{
get { return !_isSearching; }
set
{
if(_isSearching != value)
{
_isSearching = value;
OnPropertyChanged("IsSearching");
}
}
}
public CityViewModel()
{
LoadedCommand = new DelegateCommandAsync(LoadCity, LoadCanExecute);
}
private async Task LoadCity(object pArg)
{
IsSearching = true;
//**Do your searching task here**
IsSearching = false;
}
private bool LoadCanExecute(object pArg)
{
return IsSearching;
}
그런 다음 콤보 상자의 경우 IsSearching에 직접 바인딩 할 수 있습니다.
<ComboBox ItemsSource="{Binding Cities}" IsEnabled="{Binding IsSearching}" DisplayMemberPath="City" />
@Ofaim과 비슷한 접근법을 사용합니다.
private bool jobSaved = true;
private bool JobSaved
{
get => jobSaved;
set
{
if (value == jobSaved) return;
jobSaved = value;
OnPropertyChanged();
OnPropertyChanged("EnableSaveButton");
}
}
public bool EnableSaveButton => !jobSaved;
참고 URL : https://stackoverflow.com/questions/1039636/how-to-bind-inverse-boolean-properties-in-wpf
'Programing' 카테고리의 다른 글
.NET에서 CultureInfo의 CurrentCulture 속성과 CurrentUICulture 속성의 차이점은 무엇입니까? (0) | 2020.03.02 |
---|---|
MVW는 무엇을 의미합니까? (0) | 2020.03.02 |
'var that = this;'는 무엇입니까? (0) | 2020.03.02 |
왜 머그 소트보다 퀵 소트가 더 낫습니까? (0) | 2020.03.02 |
파이썬에서 목록을 비우는 방법? (0) | 2020.03.02 |