2017-10-08 1 views
0

도와주세요 : 저는 Xamarin을 사용하는 간단한 응용 프로그램에서 MVVM 디자인을 구현했습니다. 하나의 모델 (사용자)과 하나의 ViewModel (UserViewModel)이 있습니다. 이 응용 프로그램은 내 첫 번째 Xamarin/MVVM 응용 프로그램이며이 기능을 처음 사용합니다.MVVM INotifyPropertyChanged not working

내가 가진 문제는 사용자를 추가하거나 제거하면보기가 업데이트되지 않는다는 것입니다. 사용자를 추가하거나 제거 할 때 데이터베이스가 업데이트되었지만 내보기가 아닌지 확인할 수 있습니다.

아래 코드를 참조하십시오. 무엇이 없습니까?

사용자 모델 :

public class User 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public bool IsActive { get; set; } 

    public List<Role> RolesList { get; set; } 
} 

UserViewModel 코드 : (완전성에 대한 추가)

public class UsersViewModel : INotifyPropertyChanged 
     { 
     private UserServices UserServ { get; set; } 

     public User UserSelected { get; set; } 

     private ObservableCollection<User> userList; 
     public ObservableCollection<User> UserList 
     { 
      get 
      { 
       return userList; 
      } 
      set 
      { 
       if (userList != value) 
       { 
        userList = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public UsersViewModel() 
     { 
      UserServ = new UserServices(); 
      UsersLoadAsync(); 
     } 

     public async void UsersLoadAsync() 
     { 
      UserList = await UserServ.UsersGetAsync(); 
     } 
    } 

사용자 도우미 서비스 코드

public class UserServices 
    { 

     public async Task<ObservableCollection<User>> UsersGetAsync() 
     { 
      ObservableCollection<User> UserList = await App.UserService.GetAsync(); 

      return UserList; 
     } 

     public async Task<bool> UsersAddAsync(User user) 
     { 
      bool success = await App.UserService.PostAsync(user); 
      return success; 
     } 

     public async Task<bool> UsersRemoveAsync(User user) 
     { 
      bool success = await App.UserService.DeleteAsync(user.Id, user); 
      return success; 
     } 

    } 

보기 XAML 코드 :

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:local="clr-namespace:PB_Logbook" 
      x:Class="PB_Logbook.MainPage" 
      xmlns:ViewModels="clr-namespace:PB_Logbook.ViewModels;assembly:PB_Logbook"> 

    <ContentPage.BindingContext> 
     <ViewModels:UsersViewModel/> 
    </ContentPage.BindingContext> 
    <StackLayout> 
     <ListView ItemsSource="{Binding UserList, Mode=TwoWay}" HasUnevenRows="True" ItemSelected="Item_SelectedAsync" IsPullToRefreshEnabled="True"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <ViewCell> 
        <StackLayout Orientation="Vertical" Padding="12,6"> 
         <Label Text="{Binding Username}" FontSize="24"/> 
         <Label Text="{Binding FirstName}" FontSize="18" Opacity="0.6"/> 
         <Label Text="{Binding LastName}" FontSize="18" Opacity="0.6"/> 
        </StackLayout> 
       </ViewCell> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    <Button Text="Add" Clicked="AddButton_ClickedAsync"></Button> 
     <Button Text="Remove" Clicked="RemoveButton_ClickedAsync"></Button> 
    </StackLayout> 


</ContentPage> 
뒤에 17,451,515,

보기 코드 :

public partial class MainPage : ContentPage 
    { 
     private UserServices UserServices { get; set; } 
     private UsersViewModel UsersVM { get; set; } 


     public MainPage() 
     { 
      InitializeComponent(); 
      UserServices = new UserServices(); 
      UsersVM = new UsersViewModel(); 
     } 

     private async void AddButton_ClickedAsync(object sender, EventArgs e) 
     { 
      await AddUserAsync(); 
     } 

     private async void RemoveButton_ClickedAsync(object sender, EventArgs e) 
     { 
      await RemoveUserAsync(); 
     } 

     private async void Item_SelectedAsync(object sender, EventArgs e) 
     { 
      UsersVM.UserSelected = ((User)((ListView)sender).SelectedItem); 

     } 

     private async void Pull_RefreshAsync(object sender, EventArgs e) 
     { 
      //UsersVM.UsersLoadAsync(); 
     } 

     private async Task AddUserAsync() 
     { 
      Random rnd = new Random(); 
      int rndNumber = rnd.Next(1, 100); 

      User user = new User() 
      { 
       Username = "User " + rndNumber, 
       FirstName = "Firstname " + rndNumber, 
       LastName = "Surname " + rndNumber, 
       IsActive = true 
      }; 

      bool success = await UserServices.UsersAddAsync(user); 

      if (success) 
      { 
       if (!UsersVM.UserList.Contains(user)) 
        UsersVM.UserList.Add(user); 
      } 
     } 

     private async Task RemoveUserAsync() 
     { 
      bool success = await UserServices.UsersRemoveAsync(UsersVM.UserSelected); 

      if (success) 
      { 
       if (UsersVM.UserList.Contains(UsersVM.UserSelected)) 
        UsersVM.UserList.Remove(UsersVM.UserSelected); 
      } 
     } 
    } 

문제 내보기에 업데이트하지 않습니다/제거 사용자를 추가하는 것입니다.

감사합니다. 당신이 자 마린 MVVM의 새로운면,이 링크는 자 마린에서 MVVM의 기본을 이해하는 데 도움이됩니다

+1

'목록 <>'와'ObservableCollection에 <>'와'INotifyPropertyChanged' 구현을 교체 도움이되기를 바랍니다 간단한 날씨 응용 프로그램을해야합니다. – jsanalytics

+0

답장을 보내 주셔서 감사합니다. @jstreet. List <>를 ObservableCollection <>으로 대체했지만 여전히 작동하지 않습니다. 다른 조언? –

+0

내가 기회를 얻 자마자 나는 더 자세히 살펴볼 것이다. – jsanalytics

답변

2

는 나뿐만 아니라 제안

은, 코드 뒤에를 줄이고 단지 구현하십시오

https://deanilvincent.github.io/2017/06/03/basic-understanding-of-mvvm-and-databinding-in-xamarin-forms/

양식 ViewModel의 명령을 포함한 모든 것.

저장하고 업데이트 할 때 코드가 작동하지만보기가 올바르게 반영되지 않는다고 작성했습니다. 저장 명령 바로 다음에 목록을 가져 오는 방법을 사용해야합니다. 당신의 ViewModel에서 당신의 XAML

<Button Text="Save" Command="{Binding SaveCommand}"/> 

에서이 같이

, 당신은 MVVM에 새로해서, 당신은이 link를 확인할 수 있습니다 자 마린

public Command SaveCommand{ 
    get{ 
     return new Command(async()=>{ 
      // your command save here 
      // then put your method for fetching the updated list: your UsersLoadAsync(); 
     }); 
    } 
} 

에서 명령을 사용해야합니다. Xamarin MVVM을 사용합니다. 당신이 완료되면, 당신은 간단한 MVVM 구현

나는 당신이

+0

게시물을 가져 주셔서 감사합니다. 나는 당신의 충고에 따라 ViewModel로 모든 논리와 명령을 옮겼습니다. 또한 저장 후 목록 을 다시로드하려고 시도했지만 여전히보기를 새로 고치지 않습니다. –