C# WPF-无法使用MVVM更新ListView
我有一个用户控件,在列表视图中有不同的按钮。如果我实例化我的可观察列表并添加一些我可以更新的项目。但是如果我在按下按钮后实例化它,它不会更新GUIC# WPF-无法使用MVVM更新ListView,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个用户控件,在列表视图中有不同的按钮。如果我实例化我的可观察列表并添加一些我可以更新的项目。但是如果我在按下按钮后实例化它,它不会更新GUI class ModelViewA { private ObservableCollection<ObjectA> myList; public ObservableCollection<ObjectA> MyItems {get {return myList;} set {myList = value;}} privat
class ModelViewA {
private ObservableCollection<ObjectA> myList;
public ObservableCollection<ObjectA> MyItems {get {return myList;} set {myList = value;}}
private void OnConfigCommand(int numbers)
{
myList = new ObservableCollection<ObjectA>();
for(int i = 0; i < numbers; i++)
{
myList.Add(new Object() { Name="Name" });
}
}
}
class ObjectA : INotifyPropertyChanged {
private string name;
public string Name
{
get { return name; }
set
{
if (name != value)
{
name = value;
RaisePropertyChanged("Name");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
<ListView x:Name="m_List" ItemsSource="{Binding Path=MyItems,UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Top" BorderThickness="2" BorderBrush="DimGray" Margin="0,5,0,0" Height="250">
<ListView.View>
<GridView AllowsColumnReorder="False" >
<GridViewColumn Header="Name" Width="60" DisplayMemberBinding="{Binding Path= Name}"/>
<GridViewColumn Width="80" DisplayMemberBinding="{Binding ButtonName}" >
<GridViewColumn.Header>
<Button Width="76" Height="110" Content="ButtonName" Tag="0" ToolTip="Click here to import data from *.ini file." Command="{Binding OnConfigCommand}" CommandParameter="0"/>
</GridViewColumn.Header>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
类模型视图a{
私人可观察收集myList;
公共ObservableCollection MyItems{get{return myList;}set{myList=value;}}
私有void OnConfigCommand(整数)
{
myList=新的ObservableCollection();
对于(int i=0;i
对ModelViewA类也使用INotifyPropertyChanged
class ModelViewA : INotifyPropertyChanged
并定义事件,就像对ObjA类所做的那样
然后对listview的itemsource执行以下操作:
public ObservableCollection<ObjectA> MyItems
{
get {return myList;}
set {
myList = value;
RaisePropertyChanged("MyItems");
}
}
公共可观测集合MyItems
{
获取{return myList;}
设置{
myList=值;
RaisePropertyChanged(“MyItems”);
}
}
问题是您通知UI Mylist中的项目发生了更改,但没有通知MyItems正在更改 如果没有可靠地再现问题的好答案,就不可能给出好答案。也就是说,如果“在之后实例化它”,您的意思是在设置绑定之后设置
MyItems
属性,那么我不希望绑定值更新,因为您的ModelViewA
类没有实现INotifyPropertyChanged
是的,我知道这很难,但我无法发布整个代码。是的,我就是这个意思。我也这样试过,但也没有成功。但是谢谢你的帮助。最好在绑定之前更改GUI并设置我的项目。我怀疑ListView上的UpdateSourceTrigger是问题的一部分。你在那里尝试过不同的设置吗?(除了Peter所说的之外)您需要让gui知道您的收藏已更改。在MyItems属性“我不能发布整个代码”的setter中引发属性更改事件——没有人希望您这样做。请阅读,以便您了解需要什么样的代码示例。另请参阅,了解如何以清晰、可回答的方式提出问题的建议,以及该页面底部链接的文章,了解有关如何为问题提供良好代码示例的更多信息。是,混淆的可能是,如果可观察集合的内容发生更改,当然不需要引发属性更改事件。然而,这里实际的可观察集合本身正在被替换。我个人认为,为了避免这种混淆,您永远不应该允许在实例化后替换一个可观察的集合-为此集合创建一个支持的只读字段,并让您的setter只执行一个清除并逐个添加给定项。也许重新清除和添加是一种更好的做法,但我几乎看不出有什么不同。我总是像我在回答中解释的那样处理我的收藏。然而,独立于如何处理SET,OP需要实现InTyfyPrimyType。您的答案是完全有效的,并且我已经给了它一个赞成票,我只是想为OP添加一些额外的东西来考虑。