代码之家  ›  专栏  ›  技术社区  ›  Nate

使用DependencyProperty的可见性绑定

  •  1
  • Nate  · 技术社区  · 14 年前

    下面有一些简单的代码使用ToggleButton.IsChecked已选中属性设置TextBlock的可见性。很好用。由于这与我的程序结构不太相符,我试图将另一个TextBlock的可见性绑定到“this”的dependencProperty。它编译得很好,但没有效果。我做错了什么,只是不知道是什么。

    XAML公司

    <Window x:Class="ToggleButtonTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Width="200" Height="100">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
    </Window.Resources>
    <StackPanel>
        <ToggleButton x:Name="toggleButton" Content="Toggle"
                      IsChecked="True" Checked="toggleButton_Checked"/>
        <TextBlock Text="Some Text"
                   Visibility="{Binding IsChecked, 
                   ElementName=toggleButton,
                   Converter={StaticResource BooleanToVisibilityConverter}}"/>
        <TextBlock Text="More Text"
                   Visibility="{Binding ShowMoreText, 
                   ElementName=this, 
                   Converter={StaticResource BooleanToVisibilityConverter}}"/>
    </StackPanel>
    </Window>
    

    using System.Windows;
    
    namespace ToggleButtonTest
    {
        public partial class MainWindow : Window
        {
            static MainWindow()
            {
                FrameworkPropertyMetadata meta = 
                    new FrameworkPropertyMetadata(true,
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault);
    
                ShowMoreTextProperty = 
                    DependencyProperty.Register("ShowMoreText", 
                    typeof(bool), typeof(MainWindow), meta);
            }
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            public static readonly DependencyProperty ShowMoreTextProperty;
            public bool ShowMoreText
            {
                get
                {
                    return (bool)GetValue(ShowMoreTextProperty);
                }
                set
                {
                    SetValue(ShowMoreTextProperty, value);
                }
            }
    
            private void toggleButton_Checked(object sender, RoutedEventArgs e)
            {
                ShowMoreText = toggleButton.IsChecked.Value;
            }
        }
    }
    

    编辑:

    有了这个答案,我想张贴我的工作代码。。。

    XAML公司

    <Window x:Class="ToggleButtonTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Width="200" Height="100"
        Name="thisWindow">
        <Window.Resources>
            <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
        </Window.Resources>
        <StackPanel>
            <ToggleButton x:Name="toggleButton" 
                    Content="Toggle"
                    IsChecked="{Binding Path=ShowMoreText, ElementName=thisWindow}"/>
            <TextBlock Text="More Text"
                       Visibility="{Binding Path=ShowMoreText, 
                       ElementName=thisWindow,
                       Converter={StaticResource BooleanToVisibilityConverter}}"/>
        </StackPanel>
    </Window>
    

    C级#

    using System.Windows;
    
    namespace ToggleButtonTest
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            public static readonly DependencyProperty ShowMoreTextProperty =
                DependencyProperty.Register("ShowMoreText", typeof(bool),
                typeof(MainWindow), new FrameworkPropertyMetadata(true,
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
    
            public bool ShowMoreText
            {
                get
                {
                    return (bool)GetValue(ShowMoreTextProperty);
                }
                set
                {
                    SetValue(ShowMoreTextProperty, value);
                }
            }
        }
    }
    
    3 回复  |  直到 14 年前
        1
  •  11
  •   Jay    14 年前

    ElementName 必须是元素名。 this 不会飞。幸运的是,您确实有一个类型为 MainWindow 这里有一个 ShowMoreText 属性:根 Window 元素。

    把这个给我 窗口 一个名字并用它作为

    <Window x:Class="ToggleButtonTest.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Width="200" Height="100"
         x:Name="thisWindow">
    <Window.Resources>
         <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
    </Window.Resources>
    <StackPanel>
         <ToggleButton x:Name="toggleButton" Content="Toggle"
                            IsChecked="True" Checked="toggleButton_Checked"/>
         <TextBlock Text="Some Text"
                        Visibility="{Binding IsChecked, 
                        ElementName=toggleButton,
                        Converter={StaticResource BooleanToVisibilityConverter}}"/>
         <TextBlock Text="More Text"
                        Visibility="{Binding ShowMoreText, 
                        ElementName=thisWindow, 
                        Converter={StaticResource BooleanToVisibilityConverter}}"/>
    </StackPanel>
    </Window>
    

    RelativeSource Self ,但我更喜欢上面的方法。

        2
  •  2
  •   John Bowen    14 年前

    您当前设置它的方式永远不会将ShowMoreText设置为false。只有当ToggleButton的IsChecked从false更改为true时,才会调用Checked处理程序。另外,还需要一个Unchecked的处理程序。处理这种情况的最佳方法是在ToggleButton上设置一个绑定,该绑定不需要任何事件处理程序(使用Jay的更改):

    IsChecked="{Binding Path=ShowMoreText, ElementName=thisWindow}"
    
        3
  •  1
  •   Russ    14 年前

    给你的窗口一个名称,并将ElementName设置为该名称,而不是使用“this”。