Apa yang saya miliki adalah objek yang memiliki IsReadOnly
properti. Jika properti ini benar, saya ingin mengatur IsEnabled
properti pada Button, (misalnya), menjadi false.
Saya ingin percaya bahwa saya bisa melakukannya semudah IsEnabled="{Binding Path=!IsReadOnly}"
tapi itu tidak terbang dengan WPF.
Apakah saya terdegradasi karena harus melalui semua pengaturan gaya? Sepertinya terlalu bertele-tele untuk sesuatu yang sederhana seperti pengaturan satu bool ke kebalikan dari bool lain.
<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>
Jawaban:
Anda bisa menggunakan ValueConverter yang membalikkan properti bool untuk Anda.
XAML:
Konverter:
sumber
!
, itu adalah kode yang bertele-tele ... Orang-orang melakukan upaya gila untuk memisahkan apa yang mereka rasakan sebagai "kode" dari para desainer miskin. Ekstra ekstra menyakitkan ketika saya adalah pembuat kode dan perancang.Sudahkah Anda mempertimbangkan sebuah
IsNotReadOnly
properti? Jika objek yang diikat adalah ViewModel dalam domain MVVM, maka properti tambahan masuk akal. Jika model Entitas langsung, Anda dapat mempertimbangkan komposisi dan menyajikan ViewModel khusus dari entitas Anda ke formulir.sumber
Dengan penjilidan standar Anda harus menggunakan konverter yang terlihat sedikit berangin. Jadi, saya sarankan Anda untuk melihat proyek saya CalcBinding , yang dikembangkan khusus untuk menyelesaikan masalah ini dan beberapa lainnya. Dengan pengikatan tingkat lanjut, Anda dapat menulis ekspresi dengan banyak properti sumber langsung di xaml. Katakanlah, Anda dapat menulis sesuatu seperti:
atau
atau
atau
di mana A, B, C, IsChecked - properti viewModel dan itu akan berfungsi dengan baik
sumber
<Setter.Value><cb:Binding Path="!IsReadOnly" /></Setter.Value>
mendapat 'Binding' tidak valid untuk kesalahan waktu kompilasi Setter.Value 'Saya akan merekomendasikan menggunakan https://quickconverter.codeplex.com/
Membalikkan boolean kemudian sesederhana:
<Button IsEnabled="{qc:Binding '!$P', P={Binding IsReadOnly}}" />
Itu mempercepat waktu yang biasanya diperlukan untuk menulis konverter.
sumber
Saya ingin XAML saya tetap seanggun mungkin sehingga saya membuat kelas untuk membungkus bool yang berada di salah satu pustaka bersama saya, operator implisit memungkinkan kelas untuk digunakan sebagai bool dalam kode-belakang mulus
Satu-satunya perubahan yang diperlukan untuk proyek Anda adalah membuat properti yang ingin Anda kembalikan, bukan bool
Dan pada postfix XAML pengikatan dengan Value atau Invert
sumber
bool
Jenis Ekspresi / Variabel lain bahkan tidak merujuk pada nilai terbalik. Saya malah akan menambahkan Metode Ekstensi "Tidak" keBoolean
Struct
.Property
vs.Method
untukBinding
. Pernyataan "Kelemahan" saya masih berlaku. Btw, Metode Ekstensi 'Boolean` "Tidak" masih berguna untuk menghindari "!" Operator yang mudah terjawab ketika (seperti yang sering terjadi) tertanam di sebelah karakter yang terlihat seperti itu (yaitu satu / lebih "(" dan "l" dan "aku")Yang ini juga berfungsi untuk bools nullable.
sumber
Tambahkan satu properti lagi di model tampilan Anda, yang akan mengembalikan nilai terbalik. Dan ikat itu ke tombol. Suka;
dalam model tampilan:
dalam xaml:
sumber
Tidak tahu apakah ini relevan dengan XAML, tetapi dalam aplikasi Windows sederhana saya, saya membuat penjilidan secara manual dan menambahkan penangan event Format.
sumber
Format
danParse
peristiwa dalam binding WinForms kira-kira setara dengan konverter WPF.Saya punya masalah inversi, tetapi solusi yang rapi.
Motivasi adalah bahwa desainer XAML akan menunjukkan kontrol kosong misalnya ketika tidak ada datacontext / no
MyValues
(itemssource).Kode awal: sembunyikan kontrol saat
MyValues
kosong. Kode yang ditingkatkan: tunjukkan kontrol saatMyValues
BUKAN nol atau kosong.Ofcourse masalahnya adalah bagaimana mengekspresikan '1 item atau lebih', yang merupakan kebalikan dari 0 item.
Saya menyelesaikannya dengan menambahkan:
Pengaturan Ergo default untuk mengikat. Tentu ini tidak bekerja untuk semua jenis masalah terbalik, tetapi membantu saya dengan kode bersih.
sumber
💡. Solusi Inti Neto 💡
Menangani situasi nol dan tidak melempar pengecualian, tetapi kembali
true
jika tidak ada nilai yang disajikan; jika tidak, ambil Boolean yang dimasukkan dan balikkan.Xaml
App.Xaml Saya suka meletakkan semua statika konverter saya di file app.xaml jadi saya tidak perlu mendeklarasikan ulangnya di seluruh jendela / halaman / kontrol proyek.
Yang jelas
converters:
adalah namespace untuk implementasi kelas aktual (xmlns:converters="clr-namespace:ProvingGround.Converters"
).sumber
Mengikuti jawaban @ Paul, saya menulis yang berikut di ViewModel:
Saya harap memiliki cuplikan di sini akan membantu seseorang, mungkin pemula seperti saya.
Dan jika ada kesalahan, beri tahu saya!
BTW, saya juga setuju dengan komentar @heltonbiker - itu pasti pendekatan yang benar hanya jika Anda tidak harus menggunakannya lebih dari 3 kali ...
sumber
Saya melakukan sesuatu yang sangat mirip. Saya membuat properti saya di belakang layar yang memungkinkan pemilihan combobox ONLY jika sudah selesai mencari data. Ketika jendela saya pertama kali muncul, ia meluncurkan perintah yang dimuat async tapi saya tidak ingin pengguna mengklik combobox saat masih memuat data (akan kosong, maka akan diisi). Jadi, secara default, properti itu salah jadi saya mengembalikan invers di pengambil. Lalu ketika saya mencari saya mengatur properti ke true dan kembali ke false ketika selesai.
Kemudian untuk kotak kombo saya dapat mengikatnya langsung ke IsSearching:
sumber
Saya menggunakan pendekatan serupa seperti @Ofaim
sumber