Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF绑定到继承的值_C#_Wpf_Xaml - Fatal编程技术网

C# WPF绑定到继承的值

C# WPF绑定到继承的值,c#,wpf,xaml,C#,Wpf,Xaml,我试图绑定一对网格的可见性标志,但是它们似乎忽略了我的尝试。任何帮助都将不胜感激。谢谢 这在我的屏幕xaml中: <Grid Name="grdNotifLogo" Style="{StaticResource insightLogoNotify}" Visibility="{Binding Path=_notifVisibility, Mode=OneWay}" MouseDown="grdNotifLogo_MouseDown"/> <Grid Name="grdMainL

我试图绑定一对网格的可见性标志,但是它们似乎忽略了我的尝试。任何帮助都将不胜感激。谢谢

这在我的屏幕xaml中:

<Grid Name="grdNotifLogo" Style="{StaticResource insightLogoNotify}" Visibility="{Binding Path=_notifVisibility, Mode=OneWay}" MouseDown="grdNotifLogo_MouseDown"/>
<Grid Name="grdMainLogo" Style="{StaticResource insightLogo}" Visibility="{Binding Path=_logoVisibility, Mode=OneWay}"/>
数据上下文也设置到保存我感兴趣的网格的网格:

        ToolBar.DataContext = this;

是的,在Ryan,Adam和Tigran之间,你有你的答案。在代码中,完整的解决方案类似于下面的示例。请注意,当您使用“Binding”关键字时,您正试图从控件的数据上下文访问属性。这就是为什么必须将控件的“DataContext”属性设置为具有这些属性的类。正如Ryan指出的,属性也必须是公共的,否则您将无法绑定到它们。最后,正如Adam所指出的,您必须使用INotifyPropertyChanged接口将视图模型对象属性中的更改传达给控件

因此,XAML被调整为指向新的公共属性名称:

<Grid Name="grdNotifLogo" Style="{StaticResource insightLogoNotify}" Visibility="{Binding NotificationVisibility}" MouseDown="grdNotifLogo_MouseDown"/>
<Grid Name="grdMainLogo" Style="{StaticResource insightLogo}" Visibility="{Binding LogoVisibility}"/>
创建要设置为数据上下文的新视图模型类:

class MyViewModel : INotifyPropertyChanged
{
    private Visibility _logoVisibility = Visibility.Visible;
    private Visibility _notifVisibility = Visibility.Collapsed;

    public Visibility LogoVisibility
    {
        get { return _logoVisibility; }
    }

    public Visibility NotificationVisibility
    {
        get { return _notifVisibility; }
    }

    public bool NotificationIconEnabled
    {
        get { return _notifVisibility == Visibility.Visible; }
        set
        {
            if (value)
            {
                _logoVisibility = Visibility.Collapsed;
                _notifVisibility = Visibility.Visible;
            }
            else
            {
                _logoVisibility = Visibility.Visible;
                _notifVisibility = Visibility.Collapsed;
            }
            OnPropertyChanged("LogoVisibility");
            OnPropertyChanged("NotificationVisibility");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

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

    #endregion // INotifyPropertyChanged Members
}

将可见性绑定到“受保护”字段;您应该绑定到公共属性(),并且没有更改通知。我已经有了datacontext(更新的问题),但没有这些OnPropertyChanged调用。谢谢它解决了这个问题。
class MyControl : UserControl
{
    public MyControl()
    {
        InitializeComponent();
        this.DataContext = new MyViewModel();
    }
}
class MyViewModel : INotifyPropertyChanged
{
    private Visibility _logoVisibility = Visibility.Visible;
    private Visibility _notifVisibility = Visibility.Collapsed;

    public Visibility LogoVisibility
    {
        get { return _logoVisibility; }
    }

    public Visibility NotificationVisibility
    {
        get { return _notifVisibility; }
    }

    public bool NotificationIconEnabled
    {
        get { return _notifVisibility == Visibility.Visible; }
        set
        {
            if (value)
            {
                _logoVisibility = Visibility.Collapsed;
                _notifVisibility = Visibility.Visible;
            }
            else
            {
                _logoVisibility = Visibility.Visible;
                _notifVisibility = Visibility.Collapsed;
            }
            OnPropertyChanged("LogoVisibility");
            OnPropertyChanged("NotificationVisibility");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

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

    #endregion // INotifyPropertyChanged Members
}