C# Can';t将项添加到可观察集合(或未刷新UI)
我有个问题。正如标题所说,我对一个可观察的集合有一个问题。 我试图填充一个集合,通过文本框传递一个值,然后将其添加到一个可观察的集合中。当我按下“添加Ciudad”按钮时,会显示一个用于插入新值的文本框和一个用于保存新值的按钮。 该值成功地传递给负责执行该操作的方法(“添加输入城市”),但UI从未显示新项。 顺便说一下,“Load Ciudades”中手动添加的第一个值正确显示 我看到了一些相关的问题,但仍然无法解决问题 我怀疑我没有正确添加这些项目。更麻烦的是,我是一个彻头彻尾的傻瓜。 以下是您可以判断的代码: 城市模型:C# Can';t将项添加到可观察集合(或未刷新UI),c#,wpf,C#,Wpf,我有个问题。正如标题所说,我对一个可观察的集合有一个问题。 我试图填充一个集合,通过文本框传递一个值,然后将其添加到一个可观察的集合中。当我按下“添加Ciudad”按钮时,会显示一个用于插入新值的文本框和一个用于保存新值的按钮。 该值成功地传递给负责执行该操作的方法(“添加输入城市”),但UI从未显示新项。 顺便说一下,“Load Ciudades”中手动添加的第一个值正确显示 我看到了一些相关的问题,但仍然无法解决问题 我怀疑我没有正确添加这些项目。更麻烦的是,我是一个彻头彻尾的傻瓜。 以下是
public class Ciudad : INotifyPropertyChanged
{
private string nombre;
public String Nombre
{
get { return nombre; }
set {
nombre = value;
RaisePropertyChanged("Nombre");
RaisePropertyChanged("Ciudades"); //Dunno if this one is necesary.
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
public ObservableCollection<Ciudad> Ciudades { get; } = new ObservableCollection<Ciudad>();
public void LoadCiudades()
{
Ciudades.Add(new Ciudad { Nombre = "Random city" });
}
public void AddInputCity(string new_city)
{
Ciudades.Add(new Ciudad { Nombre = new_city });
}
<Grid>
<DataGrid ItemsSource = "{ Binding Path = Ciudades, UpdateSourceTrigger=PropertyChanged }" Name="DGrid">
</DataGrid>
<Button Click="Button_Click" Height="30" Width="150" Margin="0,250,0,0">Add Ciudad</Button></Grid>
城市视图模型:
public class Ciudad : INotifyPropertyChanged
{
private string nombre;
public String Nombre
{
get { return nombre; }
set {
nombre = value;
RaisePropertyChanged("Nombre");
RaisePropertyChanged("Ciudades"); //Dunno if this one is necesary.
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
public ObservableCollection<Ciudad> Ciudades { get; } = new ObservableCollection<Ciudad>();
public void LoadCiudades()
{
Ciudades.Add(new Ciudad { Nombre = "Random city" });
}
public void AddInputCity(string new_city)
{
Ciudades.Add(new Ciudad { Nombre = new_city });
}
<Grid>
<DataGrid ItemsSource = "{ Binding Path = Ciudades, UpdateSourceTrigger=PropertyChanged }" Name="DGrid">
</DataGrid>
<Button Click="Button_Click" Height="30" Width="150" Margin="0,250,0,0">Add Ciudad</Button></Grid>
有什么想法或建议吗?
谢谢大家!:) 确保在
按钮中调用现有视图模型实例的AddInputCity
方法,单击事件处理程序,例如:
private void Button_Click(object sender, RoutedEventArgs e)
{
var viewModel = DataContext as YourViewModelClass;
if (viewModel != null)
viewModel.AddInputCity("new...");
}
确保在按钮中调用现有视图模型实例的AddInputCity
方法,单击事件处理程序,例如:
private void Button_Click(object sender, RoutedEventArgs e)
{
var viewModel = DataContext as YourViewModelClass;
if (viewModel != null)
viewModel.AddInputCity("new...");
}
您还没有向我们显示您的单击代码以及其他一些内容,如视图和viewmodel之间的关系。
我建议您也看看绑定命令,而不是单击处理程序。
这篇文章旨在向读者介绍MVVM,MVVM使用以下命令向绑定的observablecollection添加一个项:
您没有向我们显示您的单击代码和其他一些内容,如视图和视图模型之间的关系。
我建议您也看看绑定命令,而不是单击处理程序。
这篇文章旨在向读者介绍MVVM,MVVM使用以下命令向绑定的observablecollection添加一个项:
您可能意外地创建了两个城市视图模型实例(这通常是此类问题的情况)。其中一个实例绑定到您的UI,而您的代码随后会更改意外创建和未绑定的第二视图模型实例的集合。检查并查看您的代码,以确定是否存在这种情况,并确保您的UI和代码隐藏使用相同的单城市视图模型实例。请发布按钮单击事件处理程序的代码。请注意,RaisePropertyChanged(“Ciudades”)
当然不是必需的。此外,在ItemsSource绑定上设置UpdateSourceTrigger=PropertyChanged
也是毫无意义的。它在那里没有效果。添加了按钮代码。谢谢你的建议!“实例事件”就是问题所在。我无意中创建了两个实例。您可能无意中创建了两个城市视图模型实例(对于类似问题通常是这样)。其中一个实例绑定到您的UI,而您的代码随后会更改意外创建和未绑定的第二视图模型实例的集合。检查并查看您的代码,以确定是否存在这种情况,并确保您的UI和代码隐藏使用相同的单城市视图模型实例。请发布按钮单击事件处理程序的代码。请注意,RaisePropertyChanged(“Ciudades”)
当然不是必需的。此外,在ItemsSource绑定上设置UpdateSourceTrigger=PropertyChanged
也是毫无意义的。它在那里没有效果。添加了按钮代码。谢谢你的建议!“实例事件”就是问题所在。我无意中创建了两个实例。太棒了!正如你们所说,我错误地创建了另一个实例。这段代码解决了这个问题。太棒了!正如你们所说,我错误地创建了另一个实例。此代码修复了该问题。