WPF中的双向绑定不适用于静态成员

Matt Hamilton告诉我一个关于
WPF的有趣事实:在版本4.5中可以使用静态变量进行双向模式绑定.

不幸的是V4.5仍然是测试版,我决定更改我的代码以使我的应用程序最终运行正确.

但是 – 我仍然有类似的问题,我们走了:

我有一个非常简单的类’RecallConnectionSettings’.这个类的成员应该可以从代码中的任何地方访问,所以我决定让它们成为静态的(像这样):

public class RecallConnectionSettings
    {
            private static string Server {get;set;} 
    }

如您所见:只有一个变量’Server’.
现在我想要的是将2WayMode从TextBox Text-property绑定到’Server’值.

所以我尝试了这个:

<UserControl....>
    <UserControl.Resources>
            <local:RecallConnectionSettings x:Key="recallConf"/>
    </UserControl.Resources>
    <TextBox Text="{Binding Source={StaticResource recallConf}, Path=Server,  
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ... Name="txtServerAdress" />
</UserControl>

当我更改文本框中的值时,这非常有用 – 但不是从另一侧更改.
如果我(手动)更改“服务器”值,我的文本框中的文本属性将不会更新.

当然不是 – 我现在知道我必须在我的RecallConnectionSettings类中实现INotifyProperty.
然后它看起来像这样:

 public class RecallConnectionSettings : INotifyPropertyChanged
    {
    public  event PropertyChangedEventHandler PropertyChanged;
    private static string s_server; 

    public static string Server
            {
                get { return s_server; }
                set
                {
                    s_server = value;
                    OnPropertyChanged("Server");
                }
            }

public static event PropertyChangedEventHandler PropertyChanged;



protected static void OnPropertyChanged(string name)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(name));
                }
            }
    }

嗯 – 这也行不通.因为只有静态方法,所以我不能使用类实例来调用事件:

PropertyChanged(this, new PropertyChangedEventArgs(name));

那么 – 现在该怎么办?
我想过使用单身人士,所以我这样做了:

public class RecallConnectionSettings : INotifyPropertyChanged
    {
        private static RecallConnectionSettings instance;

        private RecallConnectionSettings(){}

        public static RecallConnectionSettings Instance
        {
            get
            {
                if(instance == null)
                {
                    instance = new RecallConnectionSettings();
                }
                return instance;
            }
        }
// ... here comes the other stuff
}

为了使它工作,我还必须准备我的UserControl,所以我这样做:

...    
<UserControl.DataContext>
            <local:RecallConnectionSettings/>
</UserControl.DataContext>
...

此时不需要继续尝试,因为为此,默认构造函数必须是公共的.

无论我在做什么:它都行不通.
在我看来,我仍然不明白它是如何工作的 – 你会这么善良并告诉我这个诀窍吗?

最佳答案 保留单例解决方案并替换它:

...    
<UserControl>
    <UserControl.DataContext>
        <local:RecallConnectionSettings/>
    </UserControl.DataContext>
    ...
</UserControl>
...

这样:

...    
<UserControl DataContext="{x:Static local:RecallConnectionSettings.Instance}">
   ...
</UserControl>
...
点赞