【发布时间】:2019-05-21 08:07:57
【问题描述】:
RaisePropertyChanged 在调用后不会更新 UI 中的列表框。 最初,当应用程序打开时,会发生更新并填充列表。在我调用 ViewModel (TracksVM) 的构造函数后,它触发了更新 ObservableCollection 的方法,setter 填充了集合,但 RaisePropertyChanged 似乎对框没有影响。
已解决:
正如 Clemens 所建议的,我有 2 个 ViewModel 类的实例,因此列表框无法获取新创建的 Tracks 列表,因为新列表正在传递到第二个实例。一旦我在同一个对象实例上运行更新代码,列表框就会开始相应地更新。
XAML:
<ListBox Name="DownloadsBox" ItemsSource="{Binding Tracks}" SelectedItem="{Binding SelectedTrack}" Margin="10,10,10,10" DockPanel.Dock="Top" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" SelectionChanged="TracksListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding FileName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
视图模型:
public class TracksVM:INotifyPropertyChanged
{
private FileManager fm;
private ObservableCollection<Track> _tracks;
public ObservableCollection<Track> Tracks
{
get => _tracks;
set
{
_tracks = value; RaisePropertyChanged("Tracks");
}
}
private ObservableCollection<string> _genres;
public ObservableCollection<string> Genres
{
get => _genres;
set { _genres = value; RaisePropertyChanged("Genres"); }
}
private Track _selectedTrack;
public Track SelectedTrack
{
get => _selectedTrack;
set
{
_selectedTrack = value; RaisePropertyChanged("SelectedTrack");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public TracksVM()
{
fm = new FileManager();
LoadData();
}
void LoadData()
{
Console.WriteLine("Loading Tracks in Download box");
Tracks = fm.ListOfTracks(ConfigurationManager.DownloadsDirectory).ToObservableCollection();
Genres = ConfigurationManager.Genres.ToObservableCollection();
}
}
ViewModel的触发和ObservableCollection的更新:
TracksVM tVM;
internal void MoveTrack(string fileTobeMoved,string folderLocation)
{
Console.WriteLine($"Track: {fileTobeMoved}, location: {folderLocation}");
try
{
File.Move(fileTobeMoved, folderLocation);
tVM = new TracksVM();
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
【问题讨论】:
-
您能否详细说明如何将视图模型设置为窗口/控件?您使用
Binding还是只使用DataContext = new VM()? -
您正在创建一个新的 TracksVM。您是否还将这个新实例分配给视图的 DataContext?
-
@PhilippeParé - 忘了提,所以 - `TracksVM mdVM; mdVM = new TracksVM(); TracksTab.DataContext = mdVM;`
-
@Clemens - 我认为这是问题的根源,因为我没有为列表框所在的选项卡分配任何新的数据上下文
标签: c# wpf xaml observablecollection