在用户控件内绑定 XAML
Binding inside a Usercontrol XAML
我创建了一个 Usercontrol,其 属性 类型为 "User",其中包含我想绑定到 Usercontrol 内部控件的属性。
关注博客 post (http://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html),我设法进行了绑定,但是当我更新 属性 "User" 页面视图模型内部时包括我的用户控件,这些字段没有更新。
这是我的代码:
Usercontrol.xaml.cs
public sealed partial class WebTeamUserControl : UserControl
{
public WebTeamUserControl()
{
this.InitializeComponent();
(this.Content as FrameworkElement).DataContext = this;
}
public static readonly DependencyProperty UserProperty =
DependencyProperty.Register("User", typeof(User), typeof(WebTeamUserControl), new PropertyMetadata(new User()));
public User User
{
get { return (User)GetValue(UserProperty); }
set { SetValueDp(UserProperty, value); }
}
public string Username { get { return User.prenom + " " + User.nom; } }
public string Nickname { get { return User.pseudo; } }
// Some other fields
public event PropertyChangedEventHandler PropertyChanged;
void SetValueDp(DependencyProperty property, object value, [System.Runtime.CompilerServices.CallerMemberName] String p = null)
{
SetValue(property, value);
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(p));
}
}
}
绑定是 XAML 文件是用 {Binding NameOfTheProperty}
完成的
在我使用这个控件的页面中,我绑定了<controls:WebTeamUserControl User="{Binding User, Mode=TwoWay}" />
,这里是页面的数据控件:
class ProfileViewModel : ViewModelBase
{
public User User { get; set; }
public ProfileViewModel()
{
if(_isInDesignMode)
{
User = new User();
}
GetAppUser();
}
/// <summary>
/// Chargement de l'utilisateur
/// </summary>
public async void GetAppUser()
{
// Creating dummy object for design mode
if (_isInDesignMode)
{
User = new User();
}
else
{
//On charge depuis la mémoire locale l'utilisateur
try
{
var roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings;
string userNickname = (string)roamingSettings.Values["user_nickname"];
User = await User.LoadUserFromTemporaryStorage(userNickname);
RaisePropertyChanged("User");
}
catch
{
//L'utilisateur n'existe pas dans la mémoire locale, on se déconnecte
Resources.APIWebTeam.Connection.Disconnect();
}
}
RaisePropertyChanged("Username");
RaisePropertyChanged("Nickname");
RaisePropertyChanged("Promo");
RaisePropertyChanged("Groupe");
RaisePropertyChanged("DateDeNaissance");
}
}
知道为什么它不起作用吗?
用户名和字段名字段不是依赖属性。如果您简单地绑定到 User 对象上的属性,一切都应该有效(我刚刚仔细检查了本地)。
<TextBlock Text="{Binding User.Name}" />
<TextBlock Text="{Binding User.LastName}" />
我创建了一个 Usercontrol,其 属性 类型为 "User",其中包含我想绑定到 Usercontrol 内部控件的属性。
关注博客 post (http://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html),我设法进行了绑定,但是当我更新 属性 "User" 页面视图模型内部时包括我的用户控件,这些字段没有更新。
这是我的代码: Usercontrol.xaml.cs
public sealed partial class WebTeamUserControl : UserControl
{
public WebTeamUserControl()
{
this.InitializeComponent();
(this.Content as FrameworkElement).DataContext = this;
}
public static readonly DependencyProperty UserProperty =
DependencyProperty.Register("User", typeof(User), typeof(WebTeamUserControl), new PropertyMetadata(new User()));
public User User
{
get { return (User)GetValue(UserProperty); }
set { SetValueDp(UserProperty, value); }
}
public string Username { get { return User.prenom + " " + User.nom; } }
public string Nickname { get { return User.pseudo; } }
// Some other fields
public event PropertyChangedEventHandler PropertyChanged;
void SetValueDp(DependencyProperty property, object value, [System.Runtime.CompilerServices.CallerMemberName] String p = null)
{
SetValue(property, value);
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(p));
}
}
}
绑定是 XAML 文件是用 {Binding NameOfTheProperty}
在我使用这个控件的页面中,我绑定了<controls:WebTeamUserControl User="{Binding User, Mode=TwoWay}" />
,这里是页面的数据控件:
class ProfileViewModel : ViewModelBase
{
public User User { get; set; }
public ProfileViewModel()
{
if(_isInDesignMode)
{
User = new User();
}
GetAppUser();
}
/// <summary>
/// Chargement de l'utilisateur
/// </summary>
public async void GetAppUser()
{
// Creating dummy object for design mode
if (_isInDesignMode)
{
User = new User();
}
else
{
//On charge depuis la mémoire locale l'utilisateur
try
{
var roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings;
string userNickname = (string)roamingSettings.Values["user_nickname"];
User = await User.LoadUserFromTemporaryStorage(userNickname);
RaisePropertyChanged("User");
}
catch
{
//L'utilisateur n'existe pas dans la mémoire locale, on se déconnecte
Resources.APIWebTeam.Connection.Disconnect();
}
}
RaisePropertyChanged("Username");
RaisePropertyChanged("Nickname");
RaisePropertyChanged("Promo");
RaisePropertyChanged("Groupe");
RaisePropertyChanged("DateDeNaissance");
}
}
知道为什么它不起作用吗?
用户名和字段名字段不是依赖属性。如果您简单地绑定到 User 对象上的属性,一切都应该有效(我刚刚仔细检查了本地)。
<TextBlock Text="{Binding User.Name}" />
<TextBlock Text="{Binding User.LastName}" />