Kotak centang di MainWindow yang menetapkan nilai ke kontrol yang terletak di bawah UserControls

Di kelas MainWindow saya memiliki kotak centang yang mengontrol properti yang digunakan oleh banyak objek seperti kisi, tampilan daftar, dll di UserControls

    <CheckBox Content="Show objects ID" Name="showID" IsChecked="False" />

daripada ada properti yang ditentukan,

    public Visibility ShowObjectIDasVisibility
    {
        get { return showID.IsChecked.Equals(true) ? Visibility.Visible : Visibility.Collapsed; }
    }

Saya punya beberapa lagi seperti ini untuk mengembalikan boolean, lebarnya tergantung pada apa yang harus digunakan pada kontrol target.

Saya berhasil mengikat kontrol yang terletak di objek UserControl untuk menggunakan properti ini seperti ini:

<TextBlock Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=ShowObjectIDasVisibility}" />

Tapi itu hanya berfungsi satu kali, saat membuat TextBlock ini, saya dapat mengaktifkan kotak centang sebanyak yang saya suka, dan TextBlock akan tetap terlihat atau tidak tergantung pada nilai pertama.

Bagaimana saya harus melakukan ini dengan benar? Terima kasih.


person Jakub Pawlinski    schedule 12.01.2013    source sumber


Jawaban (2)


Alih-alih antarmuka INotifyPropertyChanged Anda dapat menggunakan DependencyProperty:

public Visibility ShowObjectIDasVisibility
    {
        get { return (Visibility)GetValue(ShowObjectIDasVisibilityProperty); }
        set { SetValue(ShowObjectIDasVisibilityProperty, value); }
    }
    public static readonly DependencyProperty ShowObjectIDasVisibilityProperty =
        DependencyProperty.Register("ShowObjectIDasVisibility", typeof(Visibility), typeof(MainWindow), new PropertyMetadata(Visibility.Collapsed));

Sekarang, untuk menampilkan/menyembunyikan TextBlock Anda perlu mengubah nilai ShowObjectIDasVisibility.

Misalnya, Anda dapat melakukannya dengan menambahkan kotak centang Click="OnShowID_Click dan kode di belakangnya

private void OnShowID_Click(object sender, RoutedEventArgs e)
    {
        ShowObjectIDasVisibility = ShowObjectIDasVisibility == System.Windows.Visibility.Visible ? System.Windows.Visibility.Collapsed : System.Windows.Visibility.Visible;
    }
person Rafal    schedule 12.01.2013

jika pengikatan Anda benar. Anda hanya perlu memastikan bahwa kelas kode Anda mengimplementasikan antarmuka INotifyPropertyChanged di kelas yang diikat untuk dilihat dan Anda meningkatkan acara RaisePropertyChanged di setiap perubahan status kotak centang. Untuk detail lebih lanjut lihat contoh di sini.

person D J    schedule 12.01.2013