gpt4 book ai didi

c# - 将模型中的数据对象集合绑定(bind)到 View 中的一组控件 (WPF)

转载 作者:行者123 更新时间:2023-11-30 18:05:35 26 4
gpt4 key购买 nike

我在这里提出的另一个 WPF 问题。

我目前的情况是需要绑定(bind) ObservableCollection<T>模型中的数据对象到 View 中的一组用户控件。数据对象的数量经常变化,我需要在集合变化时即时创建这些 UserControl。当前代码看起来像这样:

private void viewModel_PropertyChanged( object sender, PropertyChangedEventArgs e )
{
if( e.PropertyName.Equals( "SomeCollection" ) )
{
UpdateUI();
}
}

private void UpdateUI()
{
foreach( MyUserControl elem in _uiElements )
{
elem.MouseLeftButtonDown -= elem_MouseLeftButtonDown;
// more event handler unhooking
_MyCanvas.Children.Remove( elem );
}

_uiElements.Clear();

foreach( DataObj dataObj in ViewModel.DataObjects )
{
MyUserControl newElem = new MyUserControl();
_uiElements.Add( newElem );

fpv.MouseLeftButtonDown += fpv_MouseLeftButtonDown;
// more event handler hookups
newElem.DataObject = dataObj;

_MyCanvas.Children.Add( newElem );
Point dest = dataObj.ScreenPoint;
Canvas.SetLeft( newElem, dest.X );
Canvas.SetTop( newElem, dest.Y );
}
}

因此,如您所见,我响应(在代码中)更改的属性并动态创建一组新的 UserControl。当相应的数据对象被“移动”(它包含一个 Point 属性)、添加、创建或设置整个集合时,将调用此代码。问题是这可能需要一秒或更长时间(最坏情况下有 100 多个元素),这是 Not Acceptable 。控件本身很简单;只有一个网格和一个形状(椭圆)。

TLDR;


所以,我想我想问问是否有人遇到过类似情况。动态创建控件以响应集合中的更改并从 UI 添加/删除它们,类似于 ItemsSource 属性在 ComboBox、ListBox、DataGrid 等中的工作方式。问题是这些控件需要允许鼠标拖动和区域布局在 Canvas 中的任意位置。感谢任何帮助,提前致谢。

最佳答案

为什么不使用带有 ItemTemplateSelector 的虚拟化 ItemsControl?如果控件很简单,则应该可以为它们使用数据模板,因此无需创建用户控件。由于项目控件是虚拟化的,因此只会呈现可见项目,因此应该会更快。

关于c# - 将模型中的数据对象集合绑定(bind)到 View 中的一组控件 (WPF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5423569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com