WPF 双向绑定到静态 class 属性

WPF TwoWay Binding to a static class Property

如果 Mode=OneWay 没有问题,但我有这个: Class:

namespace Halt
{
    public class ProjectData
    {
            public static string Username {get;set;}
    }
}

和XAML:

xmlns:engine="clr-namespace:Halt.Engine"
<TextBox Name="UsernameTextBox" HorizontalAlignment="Stretch" Margin="10,5,10,0" Height="25"
         Text="{Binding Source={x:Static engine:ProjectData.Username}, Mode=TwoWay}"/>

因为 TwoWay 模式,这不想工作。那么如何解决呢?

当我必须绑定到静态 属性 时,我使用具有 属性 的 ViewModel,它在静态 属性 上获取和设置,例如

public class ProjectData
{
        public static string Username {get;set;}
}

public class ViewModel {
   public string UserName {
      get{ return ProjectData.Username ; }
      set { ProjectData.Username  = value; }
   }
}

然后我将 ViewModel 的实例设置为 UI DataContext。

如果绑定需要双向,您必须提供路径。在静态 属性 上进行双向绑定有一个技巧,前提是 class 不是静态的:在资源中声明 class 的虚拟实例,并将其用作源绑定。

<Window.Resources>
    <local:ProjectData x:Key="projectData"/>
</Window.Resources>
...

<TextBox Name="UsernameTextBox" HorizontalAlignment="Stretch" Margin="10,5,10,0" Height="25"
         Text="{Binding Source={StaticResource projectData}, Path=Username}"/>

使用静态 属性 绑定语法(据我所知,自 WPF 4.5 起可用):

<TextBox Text="{Binding Path=(engine:ProjectData.Username)}"/>

无需设置 Mode="TwoWay",因为这是 TextBox.Text 属性 的默认设置。


虽然没有明确要求,但您可能还想实施 属性 更改通知。

有关操作方法,请参阅