Saya bekerja tanpa campuran ekspresi dan hanya menggunakan editor XAML di vs2010. Terlepas dari kebijaksanaan ini, saya semakin melihat kebutuhan untuk pengikatan data waktu desain. Untuk kasus sederhana, FallbackValue
properti berfungsi dengan sangat baik (Textboxes dan TextBlocks, dll). Tetapi terutama ketika berhadapan dengan ItemsControl
dan sejenisnya, seseorang benar-benar membutuhkan data sampel untuk terlihat di perancang sehingga Anda dapat menyesuaikan dan mengubah kontrol dan templat data tanpa harus menjalankan yang dapat dieksekusi.
Saya tahu itu ObjectDataProvider
memungkinkan untuk mengikat suatu jenis, dan dengan demikian dapat memberikan data waktu desain untuk visualisasi, tetapi kemudian ada beberapa juggling untuk memungkinkan data real-time untuk mengikat tanpa membuang sumber daya dengan memuat memuat kedua waktu desain, data dummied dan binding runtime.
Sungguh apa yang saya inginkan adalah kemampuan untuk memiliki, katakanlah, "John", "Paul", "George", dan "Ringo" muncul di desainer XAML sebagai item bergaya di saya ItemsControl
, tetapi memiliki data nyata yang muncul saat aplikasi lari.
Saya juga tahu bahwa Blend memungkinkan beberapa atribut mewah yang menentukan data pengikatan waktu desain yang secara efektif diabaikan oleh WPF dalam kondisi run-time.
Jadi pertanyaan saya adalah:
1. Bagaimana cara memanfaatkan binding waktu desain dari koleksi dan data non-sepele di desainer XAML studio visual dan kemudian menukar ke binding runtime dengan lancar?
2. Bagaimana orang lain memecahkan masalah data waktu desain vs. waktu proses ini? Dalam kasus saya, saya tidak dapat dengan mudah menggunakan data yang sama untuk keduanya (seperti yang dapat dilakukan dengan, katakanlah, kueri database).
3. Apakah alternatif mereka untuk campuran ekspresi yang dapat saya gunakan untuk desain XAML terintegrasi data? (Saya tahu ada beberapa alternatif, tetapi saya secara khusus menginginkan sesuatu yang dapat saya gunakan dan melihat data sampel terikat, dll?)
sumber
d:DataContext
Anda mungkin menemukan beberapa bantuan dalam pertanyaan ini: stackoverflow.com/questions/8303803/…xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
danmc:Ignorable="d"
<Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...
. Dengan cara ini, model tampilan tiruan hanya akan dibuat di desainer, tidak saat menjalankan aplikasi Anda. Ingat, pendekatan ini mengharuskan model tampilan tiruan Anda memiliki konstruktor tanpa parameter. Tetapi kasus yang sama terjadi pada contoh yang diberikan di atas dalam jawaban.Sebagai campuran dari jawaban yang diterima Goran dan komentar Rene yang sangat bagus.
Tambahkan deklarasi namespace.
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
Referensi konteks data waktu desain Anda dari kode.
<Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...
sumber
Karl Shifflett menjelaskan pendekatan yang harus bekerja sama baiknya untuk VS2008 dan VS2010:
Melihat Data Waktu Desain di Visual Studio 2008 Cider Designer di Proyek WPF dan Silverlight
Laurent Bugnion memiliki pendekatan serupa yang berfokus pada Expression Blend. Ini mungkin berfungsi untuk VS2010, tetapi saya belum mengkonfirmasi ini.
Simulasi data dalam mode desain di Microsoft Expression Blend
sumber
Mungkin fitur desain-waktu baru dari Visual Studio 2010 dan Expression Blend 4 adalah pilihan untuk Anda.
Cara kerjanya ditunjukkan dalam contoh aplikasi BookLibrary dari WPF Application Framework (WAF) . Harap unduh versi .NET4.
sumber
Saya menggunakan pendekatan ini untuk menghasilkan data waktu desain dengan .NET 4.5 dan Visual Studio 2013.
Saya hanya memiliki satu ViewModel. Model tampilan memiliki properti
IsInDesignMode
yang memberitahu apakah mode desain aktif atau tidak (lihat kelasViewModelBase
). Kemudian Anda dapat menyiapkan data waktu desain Anda (seperti mengisi kontrol item) di konstruktor model tampilan.Selain itu, saya tidak akan memuat data nyata dalam konstruktor model tampilan, ini dapat menyebabkan masalah saat runtime, tetapi menyiapkan data untuk waktu desain seharusnya tidak menjadi masalah.
sumber
Menggunakan Visual Studio 2017 saya telah mencoba untuk mengikuti semua panduan dan pertanyaan seperti ini dan saya masih menghadapi
<ItemsControl>
yang sama sekali tidak mengeksekusi kode yang saya miliki di dalam konstruktorDesignFooViewModel
yang mewarisiFooViewModel
. Saya mengkonfirmasi bagian "tidak mengeksekusi" mengikuti panduan MSDN yang "berguna" ini (spoiler:MessageBox
debugging). Meskipun ini tidak terkait langsung dengan pertanyaan awal, saya berharap ini akan menghemat banyak waktu orang lain.Ternyata saya tidak melakukan kesalahan. Masalahnya adalah aplikasi saya harus dibuat untuk x64. Karena Visual Studio masih pada 2018 proses 32-bit dan tampaknya tidak dapat memutar proses host 64-bit untuk bagian desainer tidak dapat menggunakan kelas x64 saya. Hal yang sangat buruk adalah tidak ada kesalahan yang ditemukan di log mana pun yang dapat saya pikirkan.
Jadi, jika Anda menemukan pertanyaan ini karena Anda melihat data palsu dengan model tampilan waktu desain Anda (misalnya:
<TextBlock Text="{Binding Name}"/>
munculName
tidak peduli Anda menyetel properti ke) penyebabnya kemungkinan adalah build x64 Anda. Jika Anda tidak dapat mengubah konfigurasi build ke anycpu atau x86 karena ketergantungan, pertimbangkan untuk membuat proyek baru yang sepenuhnya anycpu dan tidak memiliki dependensi (atau dependensi apa pun). Jadi Anda akhirnya membagi sebagian besar atau semua kecuali bagian inisialisasi kode dari proyek "WPF App" Anda menjadi proyek "C # class library".Untuk basis kode yang sedang saya kerjakan, saya pikir ini akan memaksa pemisahan kekhawatiran yang sehat dengan mengorbankan beberapa duplikasi kode yang mungkin merupakan hal positif bersih.
sumber
Mirip dengan jawaban teratas, tetapi lebih baik menurut saya: Anda dapat membuat properti statis untuk mengembalikan contoh data desain dan mereferensikannya langsung dari XAML seperti:
Ini menghindari kebutuhan untuk menggunakan
UserControl.Resources
. Properti statis Anda dapat berfungsi sebagai pabrik yang memungkinkan Anda membuat tipe data non-trivial - misalnya jika Anda tidak memiliki ctor default, Anda dapat memanggil pabrik atau container di sini untuk memasukkan dependensi yang sesuai.sumber