如何绑定到单例对象实例

时间:2015-08-03 14:26:45

标签: c# xaml windows-store-apps win-universal-app

所以我有下一个名为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
}

在我的MainPage.xaml上我有一个菜单,它有一个属性IsPaneOpen,它以这种方式绑定:

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

所以我将NavigationController添加为资源:

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

得到错误:

  

无法构造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>

并使构造函数公开

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您需要在XAML中引用该Instance属性。因此,绑定时,您需要点入其中(并从实例中删除静态)。

  

Instance.IsNavigationMenuOpen

但是,如其他答案所示,请考虑新设计。也许构建一个新类型,公开所有其他控制器类型可以引用的单例实例。这样,至少,它解开了一点。