【问题标题】:Binding visibility property绑定可见性属性
【发布时间】:2014-08-20 11:20:03
【问题描述】:

我已经解决了几个关于此的问题,但无法得到正确的答案。我不知道下面的代码哪里错了。我正在绑定 TextBlock 的可见性属性,但它不起作用。这是我的 xaml 代码,正在更改按钮单击中文本块的可见性属性。

<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

默认情况下,通过更改其属性将 Textblock 可见性初始化为折叠,

IsVisible = Visibility.Collapsed; ( in the constructor)

我还派生自 INotifyPropertyChanged 接口,并在同一个类文件中实现所有这些。谁能帮帮我哪里错了?

【问题讨论】:

  • 您的代码对我有用,请确保您的绑定有效(您是否定义了 windows 的数据上下文?)。 (例如:尝试将字符串绑定到文本框的文本属性)
  • 您的TextBox 中的DataContext 是什么? (尝试设置Text="{Binding}"查看)
  • @Antoine 和 har07,正如你们所说,将字符串绑定到 textblock 的 text 属性可以正常工作。但我无法在运行时更改文本属性。例如,我在按钮单击时为该属性分配另一个字符串并且它不会改变。 NotifyPropertyChanged 有什么问题吗?在保留断点时,我可以看到按钮单击后 PropertyChanged 的​​值仍然为空。

标签: c# xaml data-binding windows-phone visibility


【解决方案1】:

看到您的回答,我几乎可以肯定您没有很好地实施 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));
            }
        }
    }
}

【讨论】:

  • 你是完美的。它工作正常,但你能更清楚地解释一下,为什么我的代码不起作用?
  • 您是否忘记在您的班级名称后添加“:INotifyPropertyChanged”?
  • 是的,我添加了。但是我从两个基类派生了我的 New() Page,一个是 INotifyPropertyChanged。像这样,New : PhoneApplicationPage, INotifyPropertyChanged
猜你喜欢
  • 2012-05-15
  • 2010-09-27
  • 2017-01-24
  • 2010-12-01
  • 2012-05-23
  • 1970-01-01
  • 2013-12-13
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多