2013-09-24 1 views
3

У меня есть формы WPF и класс пользователей (содержание атрибутов Id, логин и имя), в моем классе этой формы, я должен был получить через пользователя объект для положить эту информацию в форме с DataContext и BindingКак установить класс в DataContext с помощью XAML?

I может поставить это пользователи возражают против моего 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> 

UserForm.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 для TextBox может поставить его ценности?

+3

код за подход кажется прекрасным для меня (просто устанавливающего DataContext) –

+0

Да, это работает, но я хочу нет данных DataContext с кодом за – Lai32290

ответ

5

Некоторое время назад я написал статью о различных вариантах привязки элемента управления XAML для кодирования за свойством. Это может вам помочь.

http://codingseason.blogspot.in/2013/05/data-binding-xaml-control-to-property.html

+0

Мне нравится эта статья, четвертая тема в статье выглядит как то, что я ищу, но я пробую это – Lai32290

+0

это работа! Большое спасибо!! – Lai32290

0

Может быть, вы можете определить DependencyProperty, чтобы обернуть доступ к userObject, затем привязать его к DataContext

5

Удалите DataContext привязки, поскольку вы явно не делать MVVM шаблон. Нет смысла делать привязку.

В вашем Window.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> 

Добавьте это в ПОЗАДИ код Window.xaml.cs

public class UserForm : Window 
    { 
     public Users userObject { get; set; } 

     public UserForm(Users user) 
     { 
      InitializeComponent(); 
      this.DataContext = user; 
     } 
    } 

Если бы это в MVVM вы бы что-то подобное

V iewModel.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 обратно в пользовательский интерфейс.

View.xaml.cs

класс UserForm общественности: Окно {

public UserForm(Users user) 
    { 
     InitializeComponent(); 
     this.DataContext = new UserViewModel(user); 
    } 

View.xaml

У вас есть два варианта, вы можете явно установить DataContext только как то, что я сделал за кодом, или вы можете создать общедоступное свойство, которое возвращает UserViewModel. Это точно так же

Модель.CS

public class Users { //Whatever properties you need } 

Сейчас это очень упрощенный пример MVVM шаблона. После того, как вы знаете основы, вы можете интегрировать некоторые полезные фреймворки, которые реализуют MVVM для вас, как Caliburn Micro и MVVM Toolkit

+0

Связывание DataContext на userObject с XAML невозможно? Я новичок в MVVM – Lai32290

+0

Это не невозможно, просто вы не делаете это правильно. У вас будет ViewModel, у которого есть Пользователь как Модель. Позвольте мне уточнить ответ. –

2

Создание объекта 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; 
} 

лучше, чтобы отделить вид и ViewModel. Посмотрите на MVVM, и это будет иметь смысл.

+0

Я искал что-то похожее, чтобы решить аналогичную проблему для OP. Это было УДИВИТЕЛЬНО, и я нашел, что он может использоваться для динамической загрузки 'TabItem', если вы установите его' .Content' равным, из этого ответа, в любом случае, 'userFormView.DataContext', а не' user'. Вместо «UserForm» я использовал «UserControl» и где «Users», в вашем примере, был классом представления, которое я хотел ввести. Мне не нужно было объявлять экземпляр 'userObject', поскольку в мой случай, который был «TabItem», я устанавливал '.Content' или передавал« User user », так как я просто объявил все вместе в той же функции. Благодаря! – vapcguy

+0

'UserControl uc = new UserControl(); MyView viewObj = новый MyView(); uc.DataContext = viewObj; this.MyTabItem.Content = uc.DataContext; ', в моем случае, для всех, кого это интересует. – vapcguy

0

Это один из способов присвоения DataContext непосредственно из XAML.

Пример App.xaml

<Application.Resources> 
    <local:Users x:Key="Users"/>  
</Application.Resources> 

Пример UserForm.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> 
Смежные вопросы