2016-07-07 61 views
-2

我正在使用wpf應用程序。我有一個有一個區域的外殼。我有兩種觀點,一種是編輯人物,另一種是列出所有人員(可觀察的集合)。兩個視圖正常工作。查看並不更新wpf mvvm應用程序中的另一個視圖

每當我使用人員列表視圖和更新實體並切換到人員視圖時,我會看到更新的實體。在個人視圖中更改實體並再次返回人員視圖後,它不會更新視圖。 (我正在使用棱鏡和團結。)我卡住了。

在此先感謝。

//我的人類

public class Personel : ModelBase, IPerson 
{ 
    [Key] 
    public int PersonelId { get; set; } 

    public string Ad { get; set; } 

    public int CinsiyetId { get; set; } 

    public DateTime DogumTarihi { get; set; } 

    public string DogumYeri { get; set; } 

    public string Foto { get; set; } 

    public string IkinciAd { get; set; } 

    public int SaglikDurumId { get; set; } 

    public string SaglikSorun { get; set; } 

    public string Soyad { get; set; } 

    public int TahsilId { get; set; } 

    public long TCKN { get; set; } 

    public string BabaAdi { get; set; } 

    public string AnneAdi { get; set; } 

    public int NüfusIlId { get; set; }//+ 

    public string NüfusIlce { get; set; } 

    public string Mahalle { get; set; } 

    public int CiltNo { get; set; } 

    public int AileSiraNo { get; set; } 

    public int SiraNo { get; set; } 

    public bool MedeniHal { get; set; } 

    public DateTime EvlilikTarih { get; set; } 

    public int TelefonAsil { get; set; } 

    public int TelefonYedek { get; set; } 

    public int TelefonEv { get; set; } 

    //public string Adres { get; set; } 

    //public int IsActive { get; set; } 

    //public string Sicil { get; set; } 

    public int Boy { get; set; } 

    public int Kilo { get; set; } 

    public int KanGrubuId { get; set; }//+ 

    public bool Sigara { get; set; } 

    public int YabanciDilId { get; set; }//+ 

    public int YabanciDilDurumId { get; set; }//+ 

} 

MainWindow.xaml

<Window x:Class="Nehir.YBS.Views.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:prism="http://prismlibrary.com/" 
     prism:ViewModelLocator.AutoWireViewModel="True" 
     Title="{Binding Title}" Height="700" Width="1280" ShowInTaskbar="False" WindowStartupLocation="CenterScreen" WindowState="Maximized"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.15*"/> 
      <ColumnDefinition Width="0.85*"/> 
     </Grid.ColumnDefinitions> 
     <TreeView Grid.Column="0" Grid.RowSpan="2"> 
      <TreeViewItem Header="Lists"> 
       <Hyperlink Command="{Binding NavigateCommand}" CommandParameter="Personel">Personnel List</Hyperlink>     
      </TreeViewItem> 
      <TreeViewItem Header="Editing"> 
       <Hyperlink Command="{Binding NavigateCommand}" CommandParameter="PersonelInfo">Personnel</Hyperlink>     
      </TreeViewItem> 
     </TreeView> 
     <Grid Grid.Row="0" Grid.Column="1" Grid.RowSpan="2"> 
      <ContentControl prism:RegionManager.RegionName="ContentRegion" VerticalAlignment="Top" HorizontalAlignment="Stretch" /> 
     </Grid> 
    </Grid> 
</Window> 

MainWindowViewModel.cs

public class MainWindowViewModel : BindableBase 
    { 
     private string _title = "Prism Unity Application"; 
     public string Title 
     { 
      get { return _title; } 
      set { SetProperty(ref _title, value); } 
     } 

     private readonly IRegionManager regionManager; 

     public DelegateCommand<string> NavigateCommand { get; set; } 

     public MainWindowViewModel(IRegionManager regionManager) 
     { 
      this.regionManager = regionManager; 
      NavigateCommand = new DelegateCommand<string>(Navigate); 
     } 

     private void Navigate(string uri) 
     { 
      this.regionManager.RequestNavigate("ContentRegion", uri); 
     } 
    } 

Personel.xaml

<UserControl x:Class="Nehir.YBS.Views.Personel" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Nehir.YBS.Views" 
      xmlns:prism="http://prismlibrary.com/" 
      prism:ViewModelLocator.AutoWireViewModel="True" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="800"> 
    <Grid VerticalAlignment="Top"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <DataGrid x:Name="personelDataGrid" Grid.Row="0" ItemsSource="{Binding PersonelList,UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" Margin="0,0,280,0"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="PersonelId" Binding="{Binding PersonelId, UpdateSourceTrigger=PropertyChanged}"/> 
       <DataGridTextColumn Header="Ad" Binding="{Binding Ad, UpdateSourceTrigger=PropertyChanged}"/> 
       <DataGridTextColumn Header="Ad2" Binding="{Binding IkinciAd, UpdateSourceTrigger=PropertyChanged}"/> 
       <DataGridTextColumn Header="Soyad" Binding="{Binding Soyad, UpdateSourceTrigger=PropertyChanged}"/> 
       <DataGridTemplateColumn Header="Doğum Tarihi"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <DatePicker SelectedDate="{Binding DogumTarihi, UpdateSourceTrigger=PropertyChanged}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
     <Button Content="Kaydet" Grid.Row="1" Command="{Binding UpdateCommand}" Width="75" Height="35" Margin="15,0,15,0" VerticalAlignment="Bottom" HorizontalAlignment="Left"/> 
    </Grid> 
</UserControl> 

PersonelViewModel.cs

public class PersonelViewModel : BindableBase 
    { 
     Repository<Personel, YBSDbContext> repo = new Repository<Personel, YBSDbContext>(new YBSDbContext()); 

     private ObservableCollection<Personel> personelList; 

     public ObservableCollection<Personel> PersonelList 
     { 
      get { return personelList; } 
      set 
      { 
       SetProperty(ref personelList, value); 
      } 
     } 

     public PersonelViewModel() 
     { 
      UpdateCommand = new DelegateCommand(Execute, CanExecute); 
      PersonelList = new ObservableCollection<Personel>(repo.GetAll()); 
     } 

     private bool CanExecute() 
     { 
      if (PersonelList is ObservableCollection<Personel>) 
      { 
       return true;  
      } 
      return false; 
     } 

     private void Execute() 
     { 
      repo.Save(); 
     } 

     public DelegateCommand UpdateCommand { get; set; } 
    } 

PersoonelInfo.xaml

<UserControl x:Class="Nehir.YBS.Views.PersonelInfo" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:prism="http://prismlibrary.com/"    
      prism:ViewModelLocator.AutoWireViewModel="True" 
      VerticalAlignment="Top"> 
    <Grid VerticalAlignment="Top"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="0.95*"/> 
      <RowDefinition Height="0.05*"/> 
     </Grid.RowDefinitions> 
     <StackPanel Grid.Row="0" Orientation="Vertical" VerticalAlignment="Top"> 
      <Expander x:Name="temel" Header="Personel Kişisel Bilgileri" MinWidth="1000" HorizontalAlignment="Left" VerticalAlignment="Top"> 
       <Grid Background="#FFE5E5E5" Width="1000"> 
        <Grid.RowDefinitions> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="0,15*"/> 
         <ColumnDefinition Width="0,35*"/> 
         <ColumnDefinition Width="0,15*"/> 
         <ColumnDefinition Width="0,35*"/> 
        </Grid.ColumnDefinitions> 
        <TextBox Text="{Binding PersonelInfo.PersonelId, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.Ad, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.IkinciAd, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.Soyad, UpdateSourceTrigger=PropertyChanged}" Grid.Row="3" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.DogumTarihi, UpdateSourceTrigger=PropertyChanged}" Grid.Row="4" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.DogumYeri, UpdateSourceTrigger=PropertyChanged}" Grid.Row="5" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.TCKN, UpdateSourceTrigger=PropertyChanged}" Grid.Row="6" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.Foto, UpdateSourceTrigger=PropertyChanged}" Grid.Row="7" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.AnneAdi, UpdateSourceTrigger=PropertyChanged}" Grid.Row="8" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.BabaAdi, UpdateSourceTrigger=PropertyChanged}" Grid.Row="9" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.MedeniHal, UpdateSourceTrigger=PropertyChanged}" Grid.Row="10" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.EvlilikTarih, UpdateSourceTrigger=PropertyChanged}" Grid.Row="11" Grid.Column="1"/> 
        <TextBlock Text="PersonelId" Grid.Row="0" Grid.Column="0"/> 
        <TextBlock Text="Ad" Grid.Row="1" Grid.Column="0"/> 
        <TextBlock Text="IkinciAd" Grid.Row="2" Grid.Column="0"/> 
        <TextBlock Text="Soyad" Grid.Row="3" Grid.Column="0"/> 
        <TextBlock Text="DogumTarihi" Grid.Row="4" Grid.Column="0"/> 
        <TextBlock Text="DogumYeri" Grid.Row="5" Grid.Column="0"/> 
        <TextBlock Text="TCKN" Grid.Row="6" Grid.Column="0"/> 
        <TextBlock Text="Foto" Grid.Row="7" Grid.Column="0"/> 
        <TextBlock Text="AnneAdi" Grid.Row="8" Grid.Column="0"/> 
        <TextBlock Text="BabaAdi" Grid.Row="9" Grid.Column="0"/> 
        <TextBlock Text="MedeniHal" Grid.Row="10" Grid.Column="0"/> 
        <TextBlock Text="EvlilikTarihi" Grid.Row="11" Grid.Column="0"/> 
       </Grid> 
      </Expander> 
      <Expander x:Name="egitim_saglik" Header="Eğitim/Sağlık Bilgileri" HorizontalAlignment="Left" VerticalAlignment="Top"> 
       <Grid Background="#FFE5E5E5" Width="1000"> 
        <Grid.RowDefinitions> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="0,15*"/> 
         <ColumnDefinition Width="0,35*"/> 
         <ColumnDefinition Width="0,15*"/> 
         <ColumnDefinition Width="0,35*"/> 
        </Grid.ColumnDefinitions> 
        <TextBox Text="{Binding PersonelInfo.SaglikDurumId, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.SaglikSorun, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.Boy, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.Kilo, UpdateSourceTrigger=PropertyChanged}" Grid.Row="3" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.KanGrubuId, UpdateSourceTrigger=PropertyChanged}" Grid.Row="4" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.Sigara, UpdateSourceTrigger=PropertyChanged}" Grid.Row="5" Grid.Column="1"/> 
        <TextBlock Text="Sağlık Durumu" Grid.Row="0" Grid.Column="0"/> 
        <TextBlock Text="Sağlık Sorunu" Grid.Row="1" Grid.Column="0"/> 
        <TextBlock Text="Boy" Grid.Row="2" Grid.Column="0"/> 
        <TextBlock Text="Kilo" Grid.Row="3" Grid.Column="0"/> 
        <TextBlock Text="Kan Grubu" Grid.Row="4" Grid.Column="0"/> 
        <TextBlock Text="Sigara" Grid.Row="5" Grid.Column="0"/> 
        <TextBox Text="{Binding PersonelInfo.TahsilId, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="3"/> 
        <TextBox Text="{Binding PersonelInfo.YabanciDilId, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="3"/> 
        <TextBox Text="{Binding PersonelInfo.YabanciDilDurumId, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="3"/> 
        <TextBlock Text="TahsilId" Grid.Row="0" Grid.Column="2"/> 
        <TextBlock Text="YabanciDilId" Grid.Row="1" Grid.Column="2"/> 
        <TextBlock Text="YabanciDilDurumId" Grid.Row="2" Grid.Column="2"/> 
       </Grid> 
      </Expander> 
      <Expander x:Name="nufus_iletisim" Header="Nüfus ve İletişim Bilgileri" HorizontalAlignment="Left" VerticalAlignment="Top"> 
       <Grid Background="#FFE5E5E5" Width="1000"> 
        <Grid.RowDefinitions> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="0,15*"/> 
         <ColumnDefinition Width="0,35*"/> 
         <ColumnDefinition Width="0,15*"/> 
         <ColumnDefinition Width="0,35*"/> 
        </Grid.ColumnDefinitions> 
        <TextBox Text="{Binding PersonelInfo.NüfusIlId, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.NüfusIlce, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.Mahalle, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.CiltNo, UpdateSourceTrigger=PropertyChanged}" Grid.Row="3" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.AileSiraNo, UpdateSourceTrigger=PropertyChanged}" Grid.Row="4" Grid.Column="1"/> 
        <TextBox Text="{Binding PersonelInfo.SiraNo, UpdateSourceTrigger=PropertyChanged}" Grid.Row="5" Grid.Column="1"/> 
        <TextBlock Text="Nüfus İl" Grid.Row="0" Grid.Column="0"/> 
        <TextBlock Text="Nüfus İlçe" Grid.Row="1" Grid.Column="0"/> 
        <TextBlock Text="Mahalle" Grid.Row="2" Grid.Column="0"/> 
        <TextBlock Text="Cilt No" Grid.Row="3" Grid.Column="0"/> 
        <TextBlock Text="Aile Sıra No" Grid.Row="4" Grid.Column="0"/> 
        <TextBlock Text="Sıra No" Grid.Row="5" Grid.Column="0"/> 
        <TextBox Text="{Binding PersonelInfo.TelefonAsil, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="3"/> 
        <TextBox Text="{Binding PersonelInfo.TelefonYedek, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="3"/> 
        <TextBox Text="{Binding PersonelInfo.TelefonEv, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="3"/> 
        <TextBox Text="{Binding PersonelInfo.Adres, UpdateSourceTrigger=PropertyChanged}" Grid.Row="5" Grid.Column="3"/> 
        <TextBlock Text="Telefon" Grid.Row="0" Grid.Column="2"/> 
        <TextBlock Text="Telefon Yedek" Grid.Row="1" Grid.Column="2"/> 
        <TextBlock Text="Telefon Ev" Grid.Row="2" Grid.Column="2"/> 
        <TextBlock Text="Adres" Grid.Row="5" Grid.Column="2"/> 
       </Grid> 
      </Expander> 
     </StackPanel> 
     <StackPanel Grid.Row="1" Orientation="Horizontal"> 
      <Button Content="Kaydet" Command="{Binding UpdateCommand}" Width="75" Margin="15,0,15,0"/> 
     </StackPanel> 
    </Grid> 
</UserControl> 

PersonelInfoViewModel.cs

public class PersonelInfoViewModel : BindableBase 
    { 
     Repository<Personel, YBSDbContext> repo = new Repository<Personel, YBSDbContext>(new YBSDbContext()); 

    private Personel personelInfo; 

    public Personel PersonelInfo 
    { 
     get { return personelInfo; } 
     set 
     { 
      SetProperty(ref personelInfo, value); 
     } 
    } 



public PersonelInfoViewModel() 

{ 
    UpdateCommand = new DelegateCommand(Execute,CanExecute); 
    personelInfo = repo.FindBy(p => p.TCKN == 11111111111).Single();//for example 
} 

private bool CanExecute() 
{ 
    return PersonelInfo is Personel; 
} 

private void Execute() 
{ 
    repo.Save(); 
} 

public DelegateCommand UpdateCommand { get; set; } 
+0

1.您的Person類是什麼樣的? 2.你的xaml看起來像什麼,它顯示你想要更新的內容? 3.你的代碼實際上是修改person對象的樣子嗎?如果您認爲包括所有將佔用太多空間的內容,請使用[SSCCE](http://sscce.org/)。 –

+0

您是否有示例代碼,如果不查看代碼,則無法分辨 – CharlesMighty

+1

最佳猜測是您正在爲PersonalView創建一個新對象,該對象來自PersonalListView中的一個對象。因此,通過PersonalListView更新工作正常,但從PersonView更新並不是因爲更改不會持續到對象模型的PersonalListView副本。 – Rachel

回答

0

我目前沒有足夠的信息來肯定知道,但是當我遇到像你描述的問題,我會檢查以下內容:

  • 確保OnPropertyChanged正在調用您想要更新的屬性。使用BindableBase.SetProperty設置屬性應該爲您覆蓋。
  • 確保您的Xaml元素已正確綁定到您正在更新的屬性。確保Binding.Mode Property未設置爲防止更新控件的內容。
+0

我的視圖模型是從BindableBase繼承的。綁定模式是雙向的,更新源觸發器設置爲propertychanged。 – BilginAksoy

0

最好的猜測是要創建的PersonView一個新的對象出來 從PersonalListView的對象。所以更新通過PersonalListView 工作正常,但從PersonView更新不會因爲更改 未持久回到對象 模型的PersonalListView副本。 - 雷切爾

在閱讀雷切爾評論。我意識到,我在兩個不同的視圖中等待着兩個不同的對象,它們引用相同的實體(但完全不同的對象)來更新對方。他們只能更新自己的用戶界面和數據庫。他們無法通知我的方法發生變化。因此,我創建了一個在所有應用程序範圍內共享的單一存儲庫對象,並在我需要時使用它。

//App.xaml。CS

public partial class App : Application 
    { 
     public static Repository<Personel, YBSDbContext> repo = new Repository<Personel, YBSDbContext>(new YBSDbContext()); 

     protected override void OnStartup(StartupEventArgs e) 
     { 
      base.OnStartup(e); 

      var bootstrapper = new Bootstrapper(); 
      bootstrapper.Run(); 
     } 
    } 

和使用應用程序範圍內的資源庫對象我的觀點之一。

public class PersonelInfoViewModel : BindableBase 
{ 
    Repository<Personel, YBSDbContext> repo = App.repo; 

我不確定這是一個好方法。但它解決了我的問題,至少現在是這樣。我會很樂意聽取您的意見。

0

我想你會在Personel類中定義的所有屬性上實現屬性更改。現在你只有默認的getter setter屬性。

由於您正在進行的編輯屬性級別您的視圖不會更新,直到您有財產變更實施。

讓我知道它是否有效。

+0

使用INotifyPropertyChanged接口沒有解決我的問題。不如在PersonViewModel中填充數據網格的集合,並且填充PersonInfoViewModel的Personel對象是兩個獨立的對象,它們不通知對方。我用自己的答案處理了這種情況。謝謝... – BilginAksoy