c# - 在 WPF 中使用新 DataContext 刷新列表时如何防止 Expander listitem 折叠
问题描述
我在 WPF 中制作了一个扩展器列表。List 绑定到一个对象数组,我需要定期更新它们。
当我在展开列表中的一个扩展器后通过从数据库读取对象数组来更新对象数组时,扩展器会自动折叠。
有没有办法防止这种情况?
编辑 1
这是ObjectTab的xml部分,
<ListView x:Name="list" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" ItemsSource="{Binding Path=Objects}" ScrollViewer.CanContentScroll="False">
<ListView.ItemTemplate>
<DataTemplate>
<local:ObjectRealtimeControl></local:ObjectRealtimeControl>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
ObjectTab 的代码是
public partial class ObjectTab : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public SomeObject[] Objects { get; set; }
public ObjectTab ()
{
DataContext = this;
InitializeComponent();
runWorker();
}
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private void runWorker()
{
worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += Worker_DoWork;
worker.RunWorkerAsync();
}
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (!worker.CancellationPending )
{
refreshAll();
Thread.Sleep(1000);
}
}
private void refreshAll()
{
Shared.DB.read("Some SQL", (ex, dataTable) =>
{
Objects = dataTable.AsEnumerable().Select((row)=>{
return new SomeObject() {
id = row[0].toString(),
};
}).ToArray();
OnPropertyChanged("Objects");
}
}
}
ObjectRealtimeControl 包含 Expander,其他控件代表 SomeObject 类。
解决方案
您没有提供关于您的问题的最小、完整和可验证的示例PropertyChanged
,因此很难对您的扩展器发表任何看法,但Objects
您可以尝试更新每个对象的各个属性或清除相同的集合并重新流行它。像这样的东西:
public partial class ObjectTab : UserControl
{
public ObservableCollection<SomeObject> Objects { get; set; } = new ObservableCollection<SomeObject>();
public ObjectTab()
{
DataContext = this;
InitializeComponent();
runWorker();
}
...
private void refreshAll()
{
Shared.DB.read("Some SQL", (ex, dataTable) =>
{
var newObjects = dataTable.AsEnumerable().Select((row) => {
return new SomeObject()
{
id = row[0].toString(),
};
}).ToArray();
Dispatcher.BeginInvoke(new Action(() =>
{
Objects.Clear();
foreach (var newObject in newObjects)
Objects.Add(newObject);
}));
};
}
}
推荐阅读
- r - 在 geom_label 中解析:丰富显示对象时出错:解析中的错误(文本 = 文本 [[i]])=
- c - 编译 tftp-hpa 时出现多重定义错误
- android-tv - 如何创建垂直列表,如 android 电视的设置屏幕
- python - 出现错误:未为我的手动网络浏览器项目定义轮廓
- memory - 增加最大内存512M?
- php - 如何验证用户是否已经存在?
- javascript - 显示 react reducer 操作,例如 redux devTool
- cmd - 将多个命令行参数传递给 kdb
- android - 存储超大 pathData(s) 以便于访问
- javascript - document.getElementById() 没有找到任何东西