Давайте проверим вашу привязку! Давайте добавим к вашей форме текстовый блок и свяжем с ним свойство FirstName. Все, что вы вводите в поле Текст , должно отображаться в тексте блок , если привязка работает правильно.
Ваш MainWindow.xaml должен выглядеть примерно так:
<Window x:Class="SDT.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="clr-namespace:Junk.cats"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<TextBox HorizontalAlignment="Left" Height="23" Margin="308,90,0,0" TextWrapping="Wrap" Text = "{Binding Login}" VerticalAlignment="Top" Width="120"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="152,200,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<Button Content="Submit" Command="{Binding SubmitLoginDataCommand}" HorizontalAlignment="Left" Margin="567,259,0,0" VerticalAlignment="Top" Width="75"/>
<TextBlock HorizontalAlignment="Left" Height="32" Margin="140,247,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="346">
<Run Text="First Name: "/>
<Run Text="{Binding Path=FirstName}"/>
</TextBlock>
</Grid>
Я ожидаю, что этот тест будет работать, и вы увидите, что вы нет проблем с вашими свойствами get / set и обновлениями пользовательского интерфейса. Я считаю, что ваша проблема теперь связана с «экземпляром» (копией) UserViewModel.
Давайте представим, что мы работаем с печатным документом. Когда вы используете = new UserService (); задание, вы печатаете бесплатную sh копию нашего документа. Если мы распечатаем новый документ и передадим его в MainWindow.cs (назовем его «Боб»), И , вы затем напечатаете новую копию в своем коде userService (назовем это «Фрэнк») - это два независимых экземпляра / копии документа.
Нам нужно создать этот объект один раз и сказать «Бобу» и «Фрэнку» работать с одной и той же копией объекта. Не волнуйтесь, это проще, чем вы думаете, и вы начнете привыкать к нему по мере использования.
Я собираюсь использовать некоторые поля STATI C, чтобы упростить устранение неполадок - вам не нужно создавать экземпляр stati c для этой работы, но вам нужно чтобы убедиться, что ваш экземпляр общего класса доступен всем, кто в нем нуждается.
Шаг 1 - Создайте новый класс, назовем его «Представления». Шаг 2 - Сделайте класс publi c stati c Шаг 3 - Создайте Publi c stati c userViewModel здесь:
public static class views
{
public static UserViewModel userViewModel = new UserViewModel();
}
Now - Давайте изменим ваш MainWindow.cs для использования общего экземпляра этого класса:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = views.userViewModel;
}
}
Последнее, что вам нужно сделать - заставить вашу внешнюю функцию работать с той же копией userViewModel! У меня нет этого кода от вас, поэтому я притворяюсь, что ваша функция называется «YourFunctioNToChangeTheName», и она находится в вашем классе «UserService»:
public class UserService
{
public void YourFunctionToChangeTheName()
{
views.userViewModel.FirstName = "FRANK";
}
}
Ключевым моментом здесь является то, что вы не создаете новую «UserViewModel» - вы повторно используете тот же экземпляр , с которым связан MainWindow.cs - так что пользовательский интерфейс теперь получает «уведомление об изменении свойства» сейчас!
Помните, что UserViewModel (класс) сам по себе не является stati c, мы создали его общий / stati c экземпляр, к которому можно получить доступ из любой точки вашей программы. Я предложил этот подход, чтобы вы могли изучить основы экземпляра :)
Удачи!