Как задать класс В 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 3

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>