绑定可见性属性

3

我看了几个有关这个问题的问题,但没有得到正确的答案。我不知道以下代码哪里出错了。我绑定了TextBlock的可见性属性,但它不起作用。这是我的xaml代码,我在按钮单击时更改TextBlock的可见性属性。

<TextBlock Visibility="{Binding IsVisible}" Text="Visibility Sample" Margin="12,40" HorizontalAlignment="Center" Name="visibilityTextblock"/>
<Button Content="visibility" Tap="Button_Tap_1"/>

这是我的Button_Tap_1函数。
private void Button_Tap_1(object sender, System.Windows.Input.GestureEventArgs e)
    {
            IsVisible = Visibility.Visible;            
    }

这是我的IsVisible属性。
private Visibility _isVisible;
public Visibility IsVisible
    {
        get
        {
            return _isVisible;
        }
        set
        {
            _isVisible = value;
            NotifyPropertyChanged("IsVisible");                
        }
    }

最后,这里是我写的NotifyPropertyChanged方法。

#region NotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string p)
    {
        if (PropertyChanged == null)
            return;
        PropertyChanged(this, new PropertyChangedEventArgs(p));
    }

#endregion

默认情况下,我通过更改文本块属性将其可见性初始化为折叠状态,如下所示:

IsVisible = Visibility.Collapsed; ( in the constructor)

我也从INotifyPropertyChanged接口派生,并在同一个类文件中实现了所有这些内容。有人能帮我找出问题所在吗?


1
你的代码对我来说可以工作,确保你的绑定起作用了(你定义了窗口的数据上下文吗?)。 (例如:尝试将字符串绑定到文本框的Text属性上) - antoinestv
你的TextBox的DataContext是什么?(尝试设置“Text = {Binding}”来查看) - har07
@Antoine和har07,正如你们所说,将字符串绑定到TextBlock的Text属性上是可以的。但是我无法在运行时更改Text属性。例如,我在按钮单击事件中为该属性分配另一个字符串,但它并没有改变。NotifyPropertyChanged有问题吗?通过设置断点,我发现在按钮单击后,PropertyChanged值仍然为空。 - Balasubramani M
1个回答

2
看到你的回答,我几乎可以确定你没有很好地实现INotifyPropertyChanged。因此,这里是一个基于你的问题的示例(可以正常工作=)): Windows:XAML
<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock Visibility="{Binding IsVisible}" Text="Visibility Sample" Margin="12,40" HorizontalAlignment="Center" Name="visibilityTextblock"/>
        <Button Content="Button" Name="boutontest" HorizontalAlignment="Left" Margin="216,247,0,0" VerticalAlignment="Top" Width="74"/>
    </Grid>
</Window>

Windows : CS

namespace WpfApplication7
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new MainViewModel(this);
        }
    }
}

数据上下文:
namespace WpfApplication7
{
    class MainViewModel : ViewModelBase
    {
        private MainWindow mainWindow;

        private Visibility _isVisible = Visibility.Collapsed;
        public Visibility IsVisible
        {
            get
            {
                return _isVisible;
            }
            set
            {
                _isVisible = value;
                OnPropertyChanged("IsVisible");
            }
        }

        public MainViewModel(MainWindow mainWindow)
        {
            this.mainWindow = mainWindow;

            mainWindow.boutontest.Click += BoutonClick;
        }

        private void BoutonClick(object sender, RoutedEventArgs e)
        {
            IsVisible = Visibility.Visible;
        }
    }
}

实现INotifyPropertyChanged。
namespace WpfApplication7
{
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

你很棒。它运行良好,但你能否更清楚地解释一下,为什么我的代码没有起作用? - Balasubramani M
你是不是忘记在类名后面添加 " :INotifyPropertyChanged" 了? - antoinestv
是的,我已经添加了。但是我的New()页面从两个基类派生,一个是INotifyPropertyChanged。像这样, New : PhoneApplicationPage,INotifyPropertyChanged - Balasubramani M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接