Saya mengalami kesulitan mengikat properti string statis sederhana ke TextBox.
Inilah kelas dengan properti statis:
public class VersionManager
{
private static string filterString;
public static string FilterString
{
get { return filterString; }
set { filterString = value; }
}
}
Di xaml saya, saya hanya ingin mengikat properti statis ini ke TextBox:
<TextBox>
<TextBox.Text>
<Binding Source="{x:Static local:VersionManager.FilterString}"/>
</TextBox.Text>
</TextBox>
Semuanya dikompilasi, tetapi saat dijalankan, saya mendapatkan pengecualian berikut:
Tidak dapat mengonversi nilai dalam atribut 'Sumber' ke objek jenis 'System.Windows.Markup.StaticExtension'. Kesalahan pada objek 'System.Windows.Data.Binding' dalam file markup 'BurnDisk; komponen / selectversionpagefunction.xaml' Baris 57 Posisi 29.
Ada yang tahu apa yang saya lakukan salah?
sumber
Anda tidak dapat mengikat ke statis seperti itu. Tidak ada cara untuk mengikat infrastruktur untuk mendapatkan pemberitahuan tentang pembaruan karena tidak ada
DependencyObject
(atau objek contoh yang mengimplementasikanINotifyPropertyChanged
) yang terlibat.Jika nilai itu tidak berubah, cukup lepaskan ikatan dan gunakan
x:Static
langsung di dalamText
properti. Tetapkan diapp
bawah ini untuk menjadi lokasi namespace (dan perakitan) dari kelas VersionManager.Jika nilainya berubah, saya sarankan membuat singleton untuk memuat nilainya dan mengikatnya.
Contoh dari singleton:
sumber
Di .NET 4.5 dimungkinkan untuk mengikat ke properti statis, baca lebih lanjut
sumber
Pada WPF 4.5 Anda dapat mengikat langsung ke properti statis dan mengikat secara otomatis memperbarui ketika properti Anda diubah. Anda perlu memasang perubahan secara manual untuk memicu pembaruan yang mengikat.
Sekarang Anda dapat mengikat properti statis Anda seperti yang lain:
sumber
VersionManager
kelas dapat statis dan semuanya masih bekerja. Perhatikan kurung kurawal dalam definisi pathPath=(local:VersionManager.FilterString)
. Adakah yang tahu mengapa mereka sebenarnya dibutuhkan?Mungkin ada dua cara / sintaks untuk mengikat
static
properti. Jika p adalahstatic
properti di kelasMainWindow
, makabinding
untuktextbox
akan:1.
2.
sumber
Anda dapat menggunakan
ObjectDataProvider
kelas danMethodName
properti itu. Ini bisa terlihat seperti ini:Penyedia data objek yang dinyatakan dapat digunakan seperti ini:
sumber
Jika Anda menggunakan sumber daya lokal Anda dapat merujuk mereka sebagai berikut:
sumber
Varian yang tepat untuk .NET 4.5 +
Kode C #
Ikatan XAML (perhatian pada kawat gigi mereka (), bukan {})
sumber
Lihatlah proyek saya CalcBinding , yang memberi Anda menulis ekspresi kompleks dalam nilai properti Path, termasuk properti statis, properti sumber, Matematika, dan lainnya. Jadi, Anda bisa menulis ini:
Semoga berhasil!
sumber
Semua jawaban ini bagus jika Anda ingin mengikuti konvensi yang baik tetapi OP menginginkan sesuatu yang sederhana , yang saya inginkan juga daripada berurusan dengan pola desain GUI. Jika semua yang ingin Anda lakukan adalah memiliki string dalam aplikasi GUI dasar yang dapat Anda perbarui ad-hoc tanpa sesuatu yang mewah, Anda bisa mengaksesnya langsung di sumber C # Anda.
Katakanlah Anda punya aplikasi WPF yang sangat mendasar MainWindow XAML seperti ini,
Itu akan terlihat seperti ini:
Dalam sumber MainWindow XAML ini, Anda bisa memiliki sesuatu seperti ini di mana semua yang kita lakukan dalam mengubah nilai langsung melalui
textBlock.Text
'sget
/set
fungsi:Lalu ketika Anda memicu acara klik itu dengan mengklik tombol, voila! Kilroy muncul :)
sumber
Solusi lain adalah membuat kelas normal yang mengimplementasikan PropertyChanger seperti ini
Kemudian buat instance statis dari kelas di suatu tempat yang tidak Anda inginkan
Dan sekarang menggunakannya sebagai properti statis
Dan di sini adalah implementasi PropertyChanger jika perlu
sumber
Jawaban teranyar (.net 4.5 dan yang lebih baru):
dan XAML:
Jangan abaikan tanda kurung
sumber