ช่องทำเครื่องหมายที่ MainWindow ที่ตั้งค่าให้กับการควบคุมที่อยู่ใต้ UserControls

ในคลาส MainWindow ฉันมีช่องทำเครื่องหมายที่ควบคุมคุณสมบัติที่ใช้โดยวัตถุจำนวนมาก เช่น grids, listviews ฯลฯ ใน UserControls

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

เกินกว่าที่จะมีคุณสมบัติกำหนดไว้

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

ฉันมีสิ่งนี้มากกว่านี้เพื่อส่งคืนบูลีน ความกว้าง ขึ้นอยู่กับสิ่งที่ควรใช้กับการควบคุมเป้าหมาย

ฉันจัดการเพื่อผูกการควบคุมที่อยู่ในวัตถุ UserControl เพื่อใช้คุณสมบัตินี้ดังนี้:

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

แต่มันใช้งานได้เพียงอันเดียวในขณะที่สร้าง TextBlock นี้ ซึ่งฉันสามารถสลับช่องทำเครื่องหมายได้บ่อยเท่าที่ต้องการ และ TextBlock จะยังคงมองเห็นได้หรือไม่ขึ้นอยู่กับค่าแรก

ฉันควรทำอย่างไรดี? ขอบคุณ.


person Jakub Pawlinski    schedule 12.01.2013    source แหล่งที่มา


คำตอบ (2)


แทนที่จะเป็นอินเทอร์เฟซ INotifyPropertyChanged คุณสามารถใช้ 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));

ตอนนี้ หากต้องการแสดง/ซ่อน TextBlock ของคุณ คุณต้องเปลี่ยนค่า ShowObjectIDasVisibility

ตัวอย่างเช่น คุณสามารถทำได้โดยเพิ่มลงในช่องทำเครื่องหมาย Click="OnShowID_Click และในโค้ดด้านหลัง

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

ถ้าการผูกของคุณถูกต้อง คุณเพียงแค่ต้องตรวจสอบให้แน่ใจว่าคลาสโค้ดของคุณใช้อินเทอร์เฟซ INotifyPropertyChanged ในคลาสที่ผูกไว้เพื่อดู และคุณกำลังเพิ่มเหตุการณ์ RaisePropertyChanged ในการเปลี่ยนแปลงสถานะช่องทำเครื่องหมายทุกครั้ง สำหรับรายละเอียดเพิ่มเติม โปรดดูตัวอย่างที่นี่

person D J    schedule 12.01.2013