WPF-də tərs məntiqi xüsusiyyətləri necə bağlamaq olar?

Bir IsReadOnly mülkiyyətinə malik bir obyekt var. Bu xüsusiyyət doğruysa, IsEnabled Button (məsələn) üzərinə saxta olaraq təyin etmək IsEnabled .

Mən asanlıqla IsEnabled="{Binding Path=!IsReadOnly}" kimi bunu edə biləcəyimə inanıram, lakin bu WPF ilə əlaqəli deyil.

Bütün stil parametrlərini keçməkdən imtina edirəm? Bool bir bool başqa bir bool qarşı yaradılması kimi bir şey kimi sadə bir şey üçün çox dəqiq görünə bilər.

 <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> 
294
24 июня '09 в 19:59 2009-06-24 19:59 Russ 24 iyun 'da 19:59' da təyin olunur 2009-06-24 19:59
@ 9 cavab

ValueConverter istifadə edə bilərsiniz, bool xüsusiyyətini sizin üçün inverts.

XAML:

 IsEnabled="{Binding Path=IsReadOnly, Converter={StaticResource InverseBooleanConverter}}" 

Converter

 [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 } 
372
24 июня '09 в 20:06 2009-06-24 20:06 Cavab Chris Nicol 24 iyun 2009-cu il tarixində saat 20: 06-da verilmişdir

IsNotReadOnly əmlakını nəzərdən keçirdinizmi? İlişkili obyekt MVVM domainində ViewModel, onda əlavə əmlak məntiq verir. Bu birbaşa Təqdimat modeli olsaydı, kompozisiyanı nəzərdən keçirə və obyekt şəklində xüsusi bir model təqdim edə bilərsiniz.

border=0
87
24 июня '09 в 20:07 2009-06-24 20:07 Cavab Paul Alexander tərəfindən 24 İyun '09 'da 20:07' də verildi. 2009-06-24 20:07

Standart snapping ilə bir az küləkli görünən çeviriciləri istifadə etməliyik. Buna görə də, mən bu problemi həll etmək üçün nəzərdə tutulmuş CalcBinding layihəmə və bir sıra başqalarına baxmanı məsləhət görürəm . Uzunmüddətli məcburiyyətlə, xaml-də bir çox mənbə xüsusiyyətləri ilə ifadələr yaza bilərsiniz. Gəlin belə bir şey yaza bilərsiniz:

 <Button IsEnabled="{c:Binding Path=!IsReadOnly}" /> 

və ya

 <Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/> 

və ya

 <Label Content="{c:Binding A+B+C }" /> 

və ya

 <Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" /> 

burada A, B, C, IsChecked görünüşün xüsusiyyətləri və düzgün işləməyəcəkdir

Goodluck!

44
06 дек. cavab Alex141 06 dekabr verilir . 2014-12-06 00:14 '14 'də 0:14 2014-12-06 00:14

Https://quickconverter.codeplex.com/ ünvanını istifadə edərək gəlirəm

Boolean dəyəri sadədir: <Button IsEnabled="{qc:Binding '!$P', P={Binding IsReadOnly}}" />

Bu çeviriciləri yazmaq üçün lazım olan vaxt sürətini artırır.

13
07 авг. Cavab Noxxys 07 avqustda verilir . 2014-08-07 16:28 '14 at 16:28 2014-08-07 16:28

XAML'ımı mümkün qədər zərif qalmasını istəmişəm, buna görə də paylaşılan kitabxanalarımdan birində olan bir bool sarmalayıcı sinfi yaratdım, örtülü operatorlar sinfi kodu olmadan qüsursuz kod olaraq istifadə etməyə icazə verdilər

 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; } } 

Layihə ehtiyaclarınızın təkcə dəyişməyiniz tövsiyə etmək istəyən əmlakı bool yerinə əvəz etməkdir

  public InvertableBool IsActive { get { return true; } } 

Və dəyəri və ya inversiya istifadə edərək, postfix XAML bağlayıcı

 IsEnabled="{Binding IsActive.Value}" IsEnabled="{Binding IsActive.Invert}" 
10
04 авг. cevansio 04 aug tərəfindən verilmiş cavab 2015-08-04 13:07 '15 'də saat 13:07 ' da

Bu da null bools üçün işləyir.

  [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 } 
5
23 марта '16 в 14:59 2016-03-23 14:59 Cavab Andreas tərəfindən 23 Mart 16: 14:59 2016-03-23 ​​14:59 tarixində verilir

XAML ilə əlaqəli olub olmadığını bilmirəm amma sadə Windows tətbiqimdə əllə bağlamışam və bir format işi işləyicisini əlavə etdim.

 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; } 
1
04 марта '15 в 19:35 2015-03-04 19:35 Cavab Simon Dobson tərəfindən verilir Mart 04 '15 da 19:35 2015-03-04 19:35

Ters çevrilmə ilə əlaqədar bir problemim vardı, amma bu düzgün bir həll oldu.

Motivasiya XAML dizaynerinin məsələn, boş bir nəzarət göstərəcəyi idi. heç bir datacontext / yox MyValues (itemssource) olmadıqda.

Mənbə kodu: MyValues boş olduqda nəzarət MyValues . Təkmilləşdirilmiş kod: MyValues null və ya boş olmadığında nəzarət MyValues .

Əlbəttə ki, problem "0 və ya daha çox bal" ifadəsini əks etdirir.

 <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> 

Bunu əlavə edərək qərara aldıq:

 <DataTrigger Binding="{Binding MyValues.Count, FallbackValue=0, TargetNullValue=0}"> 

Ergo, cild üçün default dəyərini təyin edir. Əlbəttə ki, bu, hər cür tərs problemlər üçün işləmir, amma mənə təmiz kodla kömək etdi.

0
26 окт. EricG Oct 26 tərəfindən verilən cavabı 2017-10-26 10:39 '17 saat 10:39 'da 2017-10-26 10:39

Görünüş modelinizə başqa bir əmlak əlavə edin, əks dəyəri qaytaracaq. Və düyməni bağlayın. Kimi;

model görünüşü sahəsində:

 public bool IsNotReadOnly{get{return !IsReadOnly;}} 

xaml:

 IsEnabled="{Binding IsNotReadOnly"} 
0
08 сент. Cavab MMM 08 Sep verilir. 2017-09-08 16:58 '17 at 4:58 pm 2017-09-08 16:58