这就是我所拥有的 - 一个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循环来添加项目,我会更好吗?
我一直在阅读董事会中的所有相关文章但我仍然无法解决我将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) 考虑以下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"保持选中状态(假设它在新列表中).
我一直在尝试处理Rx库并使用MVVM在WPF中进行处理.我将我的应用程序分解为诸如存储库和ViewModel之类的组件.我的存储库能够一个接一个地提供学生集合,但是当我尝试添加到View绑定的ObservableCollection时,它会抛出一个线程错误.我会指出一些指针,让这对我有用.
喜,
在我的应用程序中,我使用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) 我有一个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仍然被阻止.
我究竟做错了什么?
wpf ×5
c# ×4
data-binding ×2
.net ×1
combobox ×1
datagrid ×1
listview ×1
mvvm ×1
selecteditem ×1