當按下獲取資料按鈕時,UserControllers 中的 User_List 已更改,但主視窗中的串列視圖未更新。我使用資料庫作為 EntityFramework6.0 我與您分享 UserController.cs(Viewmodel),Users.cs,MainWindow.cs,MainWindow.xaml 如何我可以解決這個問題嗎?
主視窗.cs
public partial class MainWindow : Window ,INotifyPropertyChanged
{
ViewModels.UsersController controller1;
public ObservableCollection<Users> user_List;
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public ObservableCollection<Users> User_List
{
get { return user_List; }
set {lst1.ItemsSource=user_List = value;OnPropertyChanged("User_List"); }
}
public MainWindow()
{
InitializeComponent();
controller1 = new ViewModels.UsersController();
this.DataContext = controller1;
}
private void Fetch_Data_Button_Click(object sender, RoutedEventArgs e)
{
ViewModels.UsersController controller = new ViewModels.UsersController();
controller.Increase();
lst1.UpdateLayout();
}
}
主視窗.xaml
Window x:Class="MSSQLServer.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:local="clr-namespace:MSSQLServer"
xmlns:vw="clr-namespace:MSSQLServer.ViewModels"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" >
<Window.DataContext>
<vw:UsersController/>
</Window.DataContext>
<Grid>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button x:Name="Fetch_Data_Button" Click="Fetch_Data_Button_Click" Content="Fetch Data" Width="150" Height="40" FontSize="18" Margin="10,10"></Button>
</StackPanel>
<ListView x:Name="lst1" HorizontalAlignment="Center" VerticalAlignment="Center" Height="300" Width="600" ItemsSource="{Binding User_List,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Id" DisplayMemberBinding="{Binding id,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="50"></GridViewColumn>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="120"></GridViewColumn>
<GridViewColumn Header="Surname" DisplayMemberBinding="{Binding surname,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="120"></GridViewColumn>
<GridViewColumn Header="Age" DisplayMemberBinding="{Binding age,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="120"></GridViewColumn>
<GridViewColumn Header="E-Mail" DisplayMemberBinding="{Binding email,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="120"></GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</Grid>
</Window>
用戶控制器.cs
public class UsersController :INotifyPropertyChanged
{
public ObservableCollection<Users> user_List;
public ObservableCollection<Users> User_List
{
get { return user_List; }
set { user_List = value;OnPropertyChanged("User_List"); }
}
public UsersController()
{
Increase();
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public void Increase()
{
Database1Entities entities = new Database1Entities();
User_List = new ObservableCollection<Users>(entities.Users.ToList());
}
}
和用戶.cs
public class Userss : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private int idd;
public int id
{
get { return idd; }
set { idd = value; OnPropertyChanged("id"); }
}
private string namee;
public string name
{
get { return namee; }
set { namee = value; OnPropertyChanged("name"); }
}
private string surnamee;
public string surname
{
get { return surnamee; }
set { surnamee = value; OnPropertyChanged("surname"); }
}
private int agee;
public int age
{
get { return agee; }
set { agee = value; OnPropertyChanged("age"); }
}
private string emaill;
public string email
{
get { return emaill; }
set { emaill = value; OnPropertyChanged("email"); }
}
}
uj5u.com熱心網友回復:
看看我的最新答案:C# wpf listview binding problem with observable collection
這是至少在開始時如何使用 listviews/treeviews/gridviews 的基本示例。如果您嘗試一下,那么您會將大部分代碼移動到 ViewModel 部分,但隨后您將搜索命令和它們之間的互動(prism 可能沒問題 - 我的意思是事件聚合,不要太快進行依賴注入)。
您的類之一名為 UsersController。當您切換到 WPF 時,請記住 MVC 模式不再存在,并且大部分都在 ViewModel 中的某個地方,因此它更像是 UserViewModel 或 UsersViewModel。如果我沒看錯,那么我會告訴你,很難從經典的 MVC(各種實作)切換到某種正確的、令人愉快的 MVVM。
我提供的 URL 缺少一項主要內容,即標準的 ViewModelWrapper,通常稱為 ViewModelBase 或 BaseViewModel,請自行呼叫。
它的形狀(它應該是我第一篇文章的一部分):
namespace MyNamespace.ViewModel
{
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName=null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = "")
{
if (EqualityComparer<T>.Default.Equals(storage, value))
return false;
storage = value;
this.OnPropertyChanged(propertyName);
return true;
}
}
}
uj5u.com熱心網友回復:
首先,您應該擺脫以下 XAML,因為您是以DataContext編程方式設定的:
<Window.DataContext>
<vw:UsersController/>
</Window.DataContext>
其次,您應該呼叫 的Increase()資料系結實體的方法UsersController:
private void Fetch_Data_Button_Click(object sender, RoutedEventArgs e)
{
controller1.Increase();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/346052.html
