Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 绑定textblock,使一个页面上变量的一个更改反映在UI中_.net_Wpf_Vb.net_Xaml_Xbap - Fatal编程技术网

.net 绑定textblock,使一个页面上变量的一个更改反映在UI中

.net 绑定textblock,使一个页面上变量的一个更改反映在UI中,.net,wpf,vb.net,xaml,xbap,.net,Wpf,Vb.net,Xaml,Xbap,基本布局(VB.NET和WPF/XBAP): 我有一个MainPage-MainPage.xaml 在主页内,我有一个框架承载其他页面。自动加载的第一个页面是LogIn-LogIn.xaml 用户输入他们的电子邮件进行登录(不需要密码,只需通过电子邮件进行识别,这是一个内部应用程序,因此用户不需要密码,甚至不需要密码) 在MainPage.xaml上,标题应该有一个“Hello”TexBlock(名称:ui\u txbUserName)。登录页面有一个在提交时获取用户名(出于其他原因并保存)和用

基本布局(VB.NET和WPF/XBAP)

我有一个MainPage-MainPage.xaml 在主页内,我有一个框架承载其他页面。自动加载的第一个页面是LogIn-LogIn.xaml

用户输入他们的电子邮件进行登录(不需要密码,只需通过电子邮件进行识别,这是一个内部应用程序,因此用户不需要密码,甚至不需要密码)

在MainPage.xaml上,标题应该有一个“Hello”TexBlock(名称:ui\u txbUserName)。登录页面有一个在提交时获取用户名(出于其他原因并保存)和用户名的方法

我想在用户登录时更改ui_TXB用户名,并在用户从一个帐户注销到另一个帐户时进行更新。我已经看过INotifyPropertyChanged和Dependency属性,我只是不知道该怎么做!任何帮助都会很棒

谢谢

UsingOfficeId—当用户登录时,它是一个全局变量集,应用程序中到处都使用它

我在示例应用程序中尝试了以下内容:


所有这些都没有反映在UI中好吧,我假设您没有使用MVVM设计模式来构建应用程序?如果没有,我建议您考虑一下这样做,因为它提供了许多好处,最显著的是关注点和可测试性的分离

在MVVM中,视图(.xaml文件)将其DataContext设置为视图模型。因此,对于您的主页,我将有一个MainViewModel.cs和MainView.xaml。这是一篇关于MVVM设计模式的好文章

然后,视图模型应该实现INotifyPropertyChanged(不应该在视图模型上使用依赖项属性)。此接口上有一个名为PropertyChanged的事件,您可以调用该事件来通知任何客户端(在本例中为WPF绑定客户端)您的属性发生了更改。这将使绑定无效,并导致再次调用properties getter以检索新值

通常,与任何.NET事件一样,您将创建一个帮助器方法来调用该事件,并将已更改的属性名称作为字符串传递给它。有关示例,请参见本文

在您的情况下,MainViewModel需要引用当前用户,例如作为IUser类型的公共属性,它在setter中调用您的helper方法来调用PropertyChanged事件

private IUser currentUser;

public IUser CurrentUser
{
  get
  {
    return this.currentUser;
  }

  set
  {
    this.currentUser = value;
    RaisePropertyChanged("CurrentUser");
  }
}

// constructor
public MainViewModel(IUser currentUser)
{
  this.CurrentUser = currentUser;
}

protected void RaisePropertyChanged(string propertyName)
{
  PropertyChangedEventHandler handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(propertyName));
  }
}
假设IUser具有名字和姓氏属性,您可以使用以下方法在视图中绑定到它:

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="Hello {0} {1}">
      <Binding Path="CurrentUser.FirstName" />
      <Binding Path="CurrentUser.LastName" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>


现在,无论当前用户何时更改,您的UI都将更新。请注意,如果您希望在用户类型的属性发生更改(例如forename)时更新UI,那么您的IUser的具体实现还需要实现INotifyPropertyChanged。

好的,我假设您没有使用MVVM设计模式来构建应用程序?如果没有,我建议您考虑一下这样做,因为它提供了许多好处,最显著的是关注点和可测试性的分离

在MVVM中,视图(.xaml文件)将其DataContext设置为视图模型。因此,对于您的主页,我将有一个MainViewModel.cs和MainView.xaml。这是一篇关于MVVM设计模式的好文章

然后,视图模型应该实现INotifyPropertyChanged(不应该在视图模型上使用依赖项属性)。此接口上有一个名为PropertyChanged的事件,您可以调用该事件来通知任何客户端(在本例中为WPF绑定客户端)您的属性发生了更改。这将使绑定无效,并导致再次调用properties getter以检索新值

通常,与任何.NET事件一样,您将创建一个帮助器方法来调用该事件,并将已更改的属性名称作为字符串传递给它。有关示例,请参见本文

在您的情况下,MainViewModel需要引用当前用户,例如作为IUser类型的公共属性,它在setter中调用您的helper方法来调用PropertyChanged事件

private IUser currentUser;

public IUser CurrentUser
{
  get
  {
    return this.currentUser;
  }

  set
  {
    this.currentUser = value;
    RaisePropertyChanged("CurrentUser");
  }
}

// constructor
public MainViewModel(IUser currentUser)
{
  this.CurrentUser = currentUser;
}

protected void RaisePropertyChanged(string propertyName)
{
  PropertyChangedEventHandler handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(propertyName));
  }
}
假设IUser具有名字和姓氏属性,您可以使用以下方法在视图中绑定到它:

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="Hello {0} {1}">
      <Binding Path="CurrentUser.FirstName" />
      <Binding Path="CurrentUser.LastName" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>


现在,无论当前用户何时更改,您的UI都将更新。请注意,如果您希望在用户类型的属性发生更改(例如,forename)时更新UI,那么您的IUser的具体实现还需要实现INotifyPropertyChanged。

好的,我想我应该添加另一个解决示例应用程序具体问题的答案。我已经看过了这个示例,但是代码似乎有点处于不断变化的状态!首先,您没有设置主窗口(DeaveCurror)的DATACONTURE任何地方,这应该被设置为视图模型的实例(UserViewModel.vb,虽然我会考虑重命名视图或视图模型,以便它们是MeView和MeView模型)。p> 您可以使用视图优先或视图模型优先的方法,以多种方式设置DataContext。一种快速启动测试的方法是在视图的构造函数中:

// MainWindow.xaml.vb
Class MainWindow

  Public Sub New()

      InitializeComponent()

      Me.DataContext = New UserViewModel()

  End Sub

End Class
现在,在UserViewModel中,您有一个UserName属性,但它似乎返回并设置了一个用户对象UserName属性。即使用户对象似乎从未设置在任何位置。为了简单起见,我只使用了一个字符串,并添加了一个新的支持字段:

Private _username As String
Public Property UserName() As String
     Get
         Return _username
     End Get
     Set(ByVal Value As String)
         _username = Value
         MyBase.OnPropertyChanged("UserName")
     End Set
End Property
最初,您出于某种原因调用了MyBase.OnPropertyChanged(“地址”)??这可能是复制/粘贴错误,但字符串值必须与值已更改的属性的名称匹配,因为绑定引擎将使用反射检索新属性值

最后,我刚刚更改了MainWindow.xaml中的绑定表达式

<TextBlock Grid.Row="0" Text="{Binding UserName}" />

因为DataContext没有在TextBlock上显式设置,所以它将使用视图(UserControl)的DataContext,该视图被设置为UserViewModel的实例。这意味着它将绑定到一个用户名