【问题标题】:RaisePropertyChanged doesn't update UIRaisePropertyChanged 不更新 UI
【发布时间】: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


【解决方案1】:

正如 Clemens 所建议的,我有 2 个 ViewModel 类实例,因此列表框无法获取新创建的 Track 列表,因为新列表正在传递到第二个实例。一旦我在同一个对象实例上运行更新代码,列表框就会开始相应地更新。

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 2017-03-18
    • 2015-11-28
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多