如何绑定到单例对象实例

本文关键字:单例 对象 实例 绑定 何绑定 | 更新日期: 2023-09-27 18:06:10

所以我有下一个类,叫做NavigationController它将控制所有与导航相关的操作-菜单,页面,弹出窗口等:

public class NavigationController: INotifyPropertyChanged
{
    #region ~~~ Fields ~~~
    private NavigationController instance;
    private bool isNavigationMenuOpen;
    #endregion
    #region ~~~ Constructors ~~~
    private NavigationController()
    {
    }
    #endregion
    #region ~~~ Events ~~~
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
    #region ~~~ Properties ~~~
    public NavigationController Instance
    {
        get
        {
            if(instance==null)
            {
                instance = new NavigationController();
            }
            return instance;
        }
    }
    public bool IsNavigationMenuOpen
    {
        get
        {
            return isNavigationMenuOpen;
        }
        set
        {
            if (isNavigationMenuOpen != value)
            {
                isNavigationMenuOpen = value;
                PropertyChanged(this, new PropertyChangedEventArgs("IsNavigationMenuOpen"));
            }
        }
    }
    #endregion
    #region ~~~ Methods ~~~
    public void OpenNavigationMenu()
    {
        this.IsNavigationMenuOpen = true;
    }
    public void CloseNavigationMenu()
    {
        this.IsNavigationMenuOpen = false;
    }
    #endregion
}

在我的主页上。我有一个菜单,它有一个属性IsPaneOpen,它是这样绑定的:

IsPaneOpen="{Binding IsNavigationMenuOpen, Source={StaticResource NavigationController}}"

所以我要添加NavigationController作为资源:

<Page.Resources>
    <controllers:NavigationController x:Key="NavigationController"/>
</Page.Resources>

And get error:

不能构造XAML NavigationController类型。为了成为在XAML中构造的类型不能是抽象的、接口的、嵌套的、泛型或结构,必须有一个公共默认构造函数

但是上面的code3没有绑定到一个实例,它将创建一个新的对象。我如何绑定到一个实例?

因此,按照这里的建议,我改成了:

private static NavigationController instance;

public static NavigationController Instance
    {
        get
        {
            if(instance==null)
            {
                instance = new NavigationController();
            }
            return instance;
        }
    }

和路径:

<ToggleButton VerticalAlignment="Stretch" HorizontalAlignment="Stretch" IsChecked="{Binding Path=NavigationController.Instance.IsNavigationMenuOpen, Mode=TwoWay, Source={StaticResource NavigationController}}">
        <Image Source="ms-appx:///Assets/Icons/menu-icon.png"></Image>
    </ToggleButton>

并将构造函数设为public

当我在一个控件中切换按钮时,另一个控件没有反应。有什么问题?我想每个控件都创建了两个实例…

如何绑定到单例对象实例

您需要在XAML中引用该Instance属性。所以,当绑定时,你需要点到它(并从Instance中删除静态)。

实例。IsNavigationMenuOpen

然而,正如在另一个答案中指出的,考虑一个新的设计。也许可以构建一个新的类型,公开一个所有其他控制器类型都可以引用的单例实例。这样的话,至少可以稍微解开一些。

要正确实现单例模式,Instance属性应该是静态的