Как задать класс В DataContext с помощью XAML?
У меня есть формы WPF и класс Users (content attributes Id, Login и Name), в моем классе этих форм я должен был получить объект Users для размещения этой информации в форме с DataContext
и Binding
Я могу поместить этот объект Users в мой Window.DataContext (this.DataContext = usersObject;)
с кодом позади, но я думаю, что если я могу сделать это с XAML, может быть, лучше
Я установил атрибут в моем классе UserForm (public Users usersObject {get; set;}
)
Моя форма UserForm : Window
<Window DataContext="{What need I put here?">
<Grid>
<TextBlock Text="Id:"/>
<TextBox Name="Id" Text="{Binding Path=Id}"/>
<TextBlock Text="Login:"/>
<TextBox Name="Login" Text="{Binding Path=Login}"/>
<TextBlock Text="Name:"/>
<TextBox Name="Name" Text="{Binding Path=Name}"/>
</Grid>
</Window>
Форма пользователя.код XAML.cs
public class UserForm : Window
{
public Users userObject { get; set; }
public UserForm(Users user)
{
InitializeComponent();
this.userObject = user;
}
}
Мой класс Пользователи
public class Users
{
public int Id { get; set; }
public string Login { get; set; }
public string Name { get; set; }
}
Как мне сделать для набора userObject
в самом Window.DataContext
для текстового поля можно поставить его значения?
5 ответов:
Некоторое время назад я написал статью о различных вариантах привязки элемента управления XAML к коду за свойством. Это может вам помочь.
Http://codingseason.blogspot.in/2013/05/data-binding-xaml-control-to-property.html
Удалите привязку DataContext, так как вы явно не выполняете шаблон MVVM. Нет смысла делать привязку.
В твоем окне.xaml
<Window> <Grid> <TextBlock Text="Id:"/> <TextBox Name="Id" Text="{Binding Path=Id}"/> <TextBlock Text="Login:"/> <TextBox Name="Login" Text="{Binding Path=Login}"/> <TextBlock Text="Name:"/> <TextBox Name="Name" Text="{Binding Path=Name}"/> </Grid>
Добавьте это в ваше окно за кодом .код XAML.cs
public class UserForm : Window { public Users userObject { get; set; } public UserForm(Users user) { InitializeComponent(); this.DataContext = user; } }
Если бы вы сделали это в MVVM, вы бы сделали что-то вроде этого
Видомодель.cs
public class UserViewModel { private Users _model; public UserViewModel(Users model) { _model = model; } public int Id { get { return _model.Id; } } public string Login { get { return _model.Login; } set { _model.Login; } } public string Name { get { return _model.Name; } set { _model.Name; } } }
Теперь ViewModel можно настроить в зависимости от того, что вам нужно, вы можете выставить модель, ввести ее в конструктор или просто задайте значение свойства, если оно открыто. Не забудьте реализовать INotifyPropertyChanged, если вы хотите распространить любые значения в ViewModel обратно в пользовательский интерфейс.
Вид.код XAML.cs
Открытый класс UserForm: окно {
public UserForm(Users user) { InitializeComponent(); this.DataContext = new UserViewModel(user); }
Вид.xaml
У вас есть два варианта: вы можете явно задать DataContext точно так же, как я сделал за кодом, или вы можете создать общедоступное свойство, которое возвращает UserViewModel. Это просто ... то же самое
Модель.cs
public class Users { //Whatever properties you need }
Теперь это очень упрощенный пример шаблона MVVM. После того, как вы знаете основы, вы можете интегрировать некоторые полезные фреймворки, которые реализуют MVVM для вас, как Caliburn Micro и MVVM Toolkit
Создать объект UserForm и назначить контекст данных довольно просто.
UserForm userFormView = new UserForm (); Users dataContextObject = new Users(); userFormView.DataContext = dataContextObject; userFormView.Show() //you can also use showdialog. Thats up to you
Лучше удалить следующий код:
public Users userObject { get; set; } public UserForm(Users user) { InitializeComponent(); this.userObject = user; }
Лучше разделить представление и модель представления. Взгляните на MVVM, и это будет иметь больше смысла
Возможно, вы можете определить свойство DependencyProperty, чтобы обернуть доступ к userObject, затем свяжите его с DataContext
Это один из способов назначения DataContext непосредственно из xaml.
Пример Приложения.xaml
<Application.Resources> <local:Users x:Key="Users"/> </Application.Resources>
Пример Формы Пользователя.xaml
<Window DataContext="{StaticResource Users}"> <Grid> <TextBlock Text="Id:"/> <TextBox Name="Id" Text="{Binding Path=Id}"/> <TextBlock Text="Login:"/> <TextBox Name="Login" Text="{Binding Path=Login}"/> <TextBlock Text="Name:"/> <TextBox Name="Name" Text="{Binding Path=Name}"/> </Grid> </Window>