相关疑难解决方法(0)

异步添加到ObservableCollection(或替代)

这就是我所拥有的 - 一个ListBox,其ItemsSource设置为ObservableCollection<T> - 其中T是我的自定义类,表示一个文件,只包含2个DependencyProperties:Filename和ThumbnailPath. - 列表框还定义了自定义DataTemplate,以便在其下很好地显示图像和文件名.

列表框的目的是显示当前文件夹(在TreeView中选择)中的视频文件,缩略图(异步生成;不是此问题的一部分).

因此,当我更改TreeView中的文件夹时,ObservableCollection将被清除并再次填充,这将自动反映在ListBox项目中.

问题在于:UI变得无响应,更新需要几秒钟.同样,缩略图在这里没有意义(我尝试禁用它们). 我认为花费最多时间的是构建我自定义类的50-100个实例及其可视化表示 - 它必须为每个实例初始化一个Image对象.但这只是我的猜测 - 你能否确认或排除这种可能性?

我开始认为ObservableCollection可能不是这里的方式,因为根据我的阅读和我尝试的内容,没有办法异步添加项目,至少如果这些项是DependencyObjects.我尝试使用BackgroundWorker创建我的类实例并将它们添加到ProgressChanged事件处理程序中的集合中,但它会抛出异常(某些线程与dependencyobjects问题).

有什么东西我不见了吗?或者通过简单地抛弃ObservableCollection并编写一个好的旧异步for循环来添加项目,我会更好吗?

.net c# data-binding wpf observablecollection

9
推荐指数
2
解决办法
1万
查看次数

ObservableCollection中的更改不会更新ListView

我一直在阅读董事会中的所有相关文章但我仍然无法解决我将ObservableCollection绑定到ListView时遇到的问题.

我有一个CLogEntry模型类,它基本上包装了一个字符串.

/// Model of LogEntry
public class CLogEntry:INotifyPropertyChanged
{
    /// Fields
    private string _logEntry;

    /// Property
    public string LogEntry
    {
        get { return _logEntry; }

        set
        {
            _logEntry = value;
            RaisePropertyChanged("LogEntry");
        }
    }

    /// PropertyChanged event handler
    public event PropertyChangedEventHandler PropertyChanged;

    /// Constructor
    public CLogEntry(string logEntry)
    {
        this.LogEntry = logEntry;
    }

    /// Property changed Notification        
    public void RaisePropertyChanged(string propertyName)
    {
        // take a copy to prevent thread issues
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf listview observablecollection

7
推荐指数
1
解决办法
1万
查看次数

当项目源更改时,WPF ComboBox重置所选项目

考虑以下XAML:

<ComboBox Name="CompanyComboBox" 
    HorizontalAlignment="Stretch"
    ItemsSource="{Binding Path=GlobalData.Companies}" 
    SelectedValuePath="Id"
    SelectedValue="{Binding Customer.CompanyId, ValidatesOnDataErrors=True}"
    DisplayMemberPath="Name" />
Run Code Online (Sandbox Code Playgroud)

GlobalData.Companies是公司的集合(IEnumerable<Company>); 此集合可以在后台重新加载(从Web服务下载).发生这种情况时,ComboBox会通过绑定正确地重新加载项目.但是作为副作用,它还会重置所选项目!

我使用Reflector检查组合框源,显然这是预期的行为.

有什么"好"的方式如何解决这个问题?我想要实现的是,如果用户选择"公司A"并在之后重新加载公司列表,则"公司A"保持选中状态(假设它在新列表中).

wpf combobox selecteditem

6
推荐指数
2
解决办法
9593
查看次数

从另一个线程更新ObservableCollection

我一直在尝试处理Rx库并使用MVVM在WPF中进行处理.我将我的应用程序分解为诸如存储库和ViewModel之类的组件.我的存储库能够一个接一个地提供学生集合,但是当我尝试添加到View绑定的ObservableCollection时,它会抛出一个线程错误.我会指出一些指针,让这对我有用.

c# wpf system.reactive

6
推荐指数
1
解决办法
6776
查看次数

WPF DataGrid正在添加额外的"ghost"行

喜,

在我的应用程序中,我使用DataGrid来显示一些数据.为了让所有东西都能使用线程我正在使用AsyncObservableCollectionDataGrid的DataContext.当我的应用程序启动时,它会在某些文件夹和更新中查找文件AsyncObservableCollection.查找文件是在一个单独的线程上完成的:

Task.Factory.StartNew(() => _cardType.InitAllOrdersCollection())
    .ContinueWith((t) => ThrowEvent(), TaskContinuationOptions.None);
Run Code Online (Sandbox Code Playgroud)

所有加载逻辑都在InitAllOrdersCollection()方法中.

现在这里的事情变得糟糕,当我出于某种原因启动应用程序时,我在DataGrid中获得了2行具有相同数据,即使集合中有一个项目而文件夹中只有一个文件.如果我Thread.Sleep()在加载文件之前添加一个延迟(最小50ms),那么DataGrid会正确显示所有内容(没有额外的行).延迟必须添加到线程加载文件(创建的文件Task.Factory.StartNew()).

有没有人遇到类似的东西或者我还应该尝试其他什么?提前致谢!

编辑:根据要求添加一些代码:

public AsyncObservableCollection<IGridItem> OrdersCollection = new AsyncObservableCollection<IGridItem>();

public void InitAllOrdersCollection()
{
    // Thread.Sleep(50); <-- this sleep here fixes the problem!
    foreach (var convention in FileNameConventions)
    {
        var namePatterns = convention.NameConvention.Split(',');
        foreach (var pattern in namePatterns)
        {
            var validFiles = CardTypeExtensions.GetFiles(this.InputFolder, pattern, convention);
            if (validFiles.Any())
            {
                this.FilesToOrders(validFiles, convention);
            }
        }
    }
}

public static List<string> GetFiles(string inputFolder, string pattern, …
Run Code Online (Sandbox Code Playgroud)

c# datagrid observablecollection

6
推荐指数
2
解决办法
1004
查看次数

使用任务但UI仍然被阻止

我有一个WPF MVVM c#应用程序.在我的一个视图中,我必须在单击按钮后从数据库中检索数据.对数据库的调用非常长,所以我想在调用时启用微调器,并在调用完成后禁用它.

所以在处理按钮单击的方法中(使用Command,而不是后面的代码)我设置boolean变量以启用微调器,然后创建一个Task取数据并将其设置为 ObservableCollection<T>这样的

private void GetDataButtonCommand() {
    this.IsBusy = true;
    var tasks = new List<Task>();

    tasks.Add(Task.Factory.StartNew(() =>
    {
        System.Windows.Application.Current.Dispatcher.BeginInvoke(new System.Action(() =>
        {
            var GotData= DBHelper.GetData();
            _observablecollectionname.Clear();
            foreach (var item in GotData)
            {
                _observablecollectionname.Add(item);
            }
        }));
    }));

    var finalTask = Task.Factory.ContinueWhenAll(tasks.ToArray(), datacomplete =>
    {
        this.IsBusy = false;  
    });
}
Run Code Online (Sandbox Code Playgroud)

完成后Task我想禁用微调器.

我遇到的问题是我在通话期间无法看到微调器.即使您使用a Task来执行数据库查询,UI仍然被阻止.

我究竟做错了什么?

c# wpf multithreading mvvm

0
推荐指数
1
解决办法
87
查看次数