【发布时间】:2021-09-15 20:47:03
【问题描述】:
我最近在尝试更新 ObservableCollection 绑定到堆栈面板时遇到 WPF UI 问题。
我在 WPF 中有一个 StackPanel,其中包含自定义 UserControl。所有这些 UIElement 都在名为“参数”的 ObservableCollection 中。我有他们这样的:
Parametres.Clear();
foreach(UIElement uie in SReference.UIEList)
{
Parametres.Add(uie);
}
方法调用时,我清除旧参数ObservableCollection,直接设置新的。
该方法没有任何问题,只是当我快速更改新参数列表时,UI 会错过其中的一些。 UI 没有跳过它们,似乎跳过了渲染
但是当我更改UI大小或刷新某些东西时,突然出现参数
是否有刷新 UI 或等待列表中每个 UIElement 的 UIElement 渲染的方法?
更多详情:
此应用程序是插件,允许用户在 3D 设计软件中创建自定义 3D 模型。目标是跨越不同的模型参考并向用户显示可以在插件内编辑的参数。
我有一个包含功能区和主要内容部分的窗口。必要时更改此主要内容部分。
1- 用户选择模型类别
2- 用户选择产品
3- 用户选择标准参考或自定义参考
4- 用户编辑参数
这个模型有很多属性和一些方法,比如上面的那个。 3D 模型类别是 ObservableCollection ComboBox 内容绑定到两个 ObservableCollection 并且包含参数的堆栈面板绑定到 ObservableCollection
每次您在第 1 步、第 2 步或第 3 步更改某些内容时,ObservableCollection 都会清楚并获取(或不获取)一些新元素。 有元素是由主模型类生成的。
stackpanel 中的每个 UIElement 都是自定义用户控件。我有两种:
这是“SReference.UIEList”背后的代码
private List<UIElement> uieList;
public List<UIElement> UIEList
{
get
{
uieList.Clear();
// On ajoute tous les éléments d'interface dans la liste.
foreach(LengthParameterModelView parametre in parameters)
{
uieList.Add(parametre.lp);
}
string lastGroupeOption = "";
foreach (OptionParameterModelView option in options)
{
if(lastGroupeOption == "" || option.NomGroupe != lastGroupeOption)
{
lastGroupeOption = option.NomGroupe;
// Création du label du groupe d'options
Label l = new Label();
l.Margin = new Thickness(5, 0, 10, 0);
l.Style = ProduitAssocié.SousSectionUI.Resources["OptionLabel"] as Style;
l.Content = option.NomGroupe;
uieList.Add(l);
}
uieList.Add(option.ynp);
}
return uieList;
}
}
parametre.lp是长度参数的ViewModel生成的UIElement
option.ynp是yes no参数的ViewModel生成的UIElement
希望这会有所帮助。
【问题讨论】:
-
您应该在 ItemTemplate 中将 ItemsControl 与 UserControl 一起使用。
-
这不相关,是不是:stackoverflow.com/q/82847/982149?
-
@Clemens 你的意思是改变 UserControl 为 ItemControl ?
-
@Fildor 并不是因为我的方法不能异步工作。它位于我的模型部分。
-
见Data Templating Overview。 UserControl 应在用作 ItemsControl 的 ItemTemplate 的 DataTemplate 中声明。因此,它将用于可视化 ItemsSource 集合中的单个数据项,这将是数据项的 ObservableCollection。