Saya memiliki perintah yang saya jalankan dari file XAML saya menggunakan sintaks standar berikut:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
Ini bekerja dengan baik sampai saya menyadari bahwa saya membutuhkan DUA potong informasi dari tampilan untuk membuat operasi ini melengkapi seperti yang diharapkan pengguna (lebar dan tinggi kanvas secara khusus).
Sepertinya mungkin untuk melewatkan array sebagai argumen ke perintah saya, tapi saya tidak melihat ada cara untuk menentukan pengikatan ke dua properti kanvas saya di CommandParameter:
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>
Bagaimana cara menyampaikan Lebar dan Tinggi ke perintah saya? Sepertinya tidak mungkin menggunakan perintah dari XAML dan saya perlu memasang handler klik di codebehind saya untuk mendapatkan informasi ini agar lolos ke metode zoom saya.
Jawaban:
Pertama, jika Anda melakukan MVVM, Anda biasanya memiliki informasi ini tersedia untuk VM Anda melalui properti terpisah yang terikat dari tampilan. Itu menghemat Anda harus melewati parameter apa pun untuk perintah Anda.
Namun, Anda juga bisa mengikat banyak dan menggunakan konverter untuk membuat parameter:
Di konverter Anda:
Kemudian, dalam logika eksekusi perintah Anda:
sumber
Dalam konverter dari solusi yang dipilih, Anda harus menambahkan nilai. Mengkloning () jika tidak, parameter di akhir perintah nol
sumber
Gunakan Tuple di Konverter, dan di OnExecute, masukkan objek parameter kembali ke Tuple.
sumber
Jika nilai Anda statis, Anda dapat menggunakan
x:Array
:sumber
SystemColors
misalnya, Anda harus menggunakanDynamicResource
bukanStaticResource
karena pengguna dapat mengubah warna sistem melalui Control Panel selama eksekusi. KanvasWidth
danHeight
bukan sumber daya dan tidak statis. Ada properti contoh yang diwarisi dariFrameworkElement
.Tentang menggunakan Tuple di Konverter, akan lebih baik menggunakan 'objek' daripada 'string', sehingga berfungsi untuk semua jenis objek tanpa batasan objek 'string'.
Maka logika eksekusi di Command bisa seperti ini
dan multi-bind dengan konverter untuk membuat parameter (dengan dua objek TextBox)
sumber