簡體   English   中英

WPF綁定到繼承值

[英]WPF Binding to an inherited value

我試圖綁定一對網格的可見性標志,但是它們似乎無視我的嘗試。 任何幫助,將不勝感激。 謝謝!

這是在我的屏幕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}"/>

屏幕的xaml.cs文件繼承了一個窗口基類,該基類具有以下內容:

protected Visibility _logoVisibility = _ Visibility.Visible;
protected Visibility _notifVisibility = _ Visibility.Collapsed;
public bool NotificationIconEnabled
{
    get { return _notifVisibility == Visibility.Visible; }
    set
    {
        if (value)
        {
            _logoVisibility = Visibility.Collapsed;
            _notifVisibility = Visibility.Visible;
        }
        else
        {
            _logoVisibility = Visibility.Visible;
            _notifVisibility = Visibility.Collapsed;
        }
    }
}

數據上下文也已設置到保存我感興趣的網格的網格中:

        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 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM