【问题标题】:Combobox Text property not changing in user control组合框文本属性在用户控件中未更改
【发布时间】:2013-12-30 20:53:24
【问题描述】:

我有一个list box,它有一个用户控件列表。每个用户控件有 5 个组合框。我希望能够从主应用程序中读取每个用户控件中每个组合框的选定文本。但是,当我更改组合框中的选择时,当我在主应用程序中读取它时,用户控件中组合框的 text 属性不会改变。

代码隐藏:

radQueryParamList.Items.Add(new TCardQueryParameters());

Xaml(这只是一个如何显示 TCardQueryParameters 对象的数据模板):

<DataTemplate x:Key="TCardViewQueryParamDataTemplate"> 
        <tcardqueryparam:TCardQueryParameters x:Name="TCardViewerParamUC" /> 
</DataTemplate>
<telerik:RadListBox Grid.Column="1"  ItemTemplate="{StaticResource TCardViewQueryParamDataTemplate}" Name="radQueryParamList" VerticalAlignment="Top" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Grid.ColumnSpan="3">

我循环遍历用户控件列表的地方

string test = radTESTGACC.Text;//TEST combo box, Text property changes
//radQueryParamList is a listbox of user controls where TCardQueryParameters is the UC

foreach(TCardQueryParameters param in radQueryParamList.Items)
{
    //Each UC has a radGACC combo box in it, and I am reading what the user
    //selected for each user control here in the main app, but the text property 
    //never changes
    String gacc = param.radGACC.Text; //Text property DOESN'T CHANGE
}

我认为用户控件的每个实例都会保持自己的状态,我只能读取用户为该组合框选择的内容,但事实并非如此。

【问题讨论】:

  • 您是否已将内部 ComboBox 的 SelectedItemSelectedValueSelectedIndex 属性绑定到任何东西以保持其选择?我在你的 XAML 中没有看到它
  • 我没有,但我认为既然我正在阅读用户控件的实际组合框,我就不必这样做了。这就是我试图这样做的原因,所以我可以遍历内存中的实际控件并读取“文本”属性。所以似乎因为我传入了一个新的视图模型,我需要将选择绑定到这个视图模型中的一个属性,以便我的主应用程序可以读取它?

标签: wpf


【解决方案1】:

您尚未将内部ComboBoxSelectedItemSelectedValueSelectedIndex 属性绑定到任何东西,因此它保持其选择。

ItemTemplate 就像切饼干一样。它包含对象的定义,但不包含对象本身。特定于对象状态的属性会丢失,除非它们绑定到模板后面的 DataContext 上的某些东西。

这有两个方面需要注意。

首先,为了提高性能,WPF 通常会卸载不可见的项目,这通常会导致项目在重新加载时从其模板中重新创建。例如,当您将应用程序最小化到任务栏,然后再次最大化它时。这通常在性能和内存使用方面更好,但这确实意味着您必须确保将使用 Template 创建的项目的状态存储在某处。

其次,默认情况下ListBoxes 使用称为虚拟化的东西。一个简单的解释方法是:

假设您有一个包含 100,000 个项目的 ListBox。在您的ListBox 中,一次只能看到 10 个项目。 WPF 将呈现大约 14 个项目(10 个可见项目,然后是一些额外的用于滚动缓冲区,因此您在滚动时不会看到任何异常)。当您滚动到新项目时,WPF 只是重新使用已呈现的现有项目,并替换这些项目后面的 DataContext

您可以猜到,渲染 14 个 UI 项而不是 100k 个项在性能上要好得多。

所以要回答您的问题,您可能希望将TCardQueryParameters UserControl 的SelectedItemSelectedValueSelectedIndex 绑定到DataContext 上的属性(在您的情况下似乎是另一个不同的UserControl)。

可能应该注意的是,您实际上所做的是创建UserControls 的列表,将它们分配给ListBox,然后告诉ListBox 它应该用另一个单独的@ 绘制每个UserControl 987654341@。因此,尽管您正在更改模板 UserControl 中的 SelectedItem,但该更改不会反映到您的 ListBox.Items 副本 UserControl

我猜您可能不希望这样,因此建议您完全删除您的 ItemTemplate

或者更好的是,创建一个包含 UserControl 的所有数据的新类对象,并将其添加到 ListBox.Items。然后告诉 ListBox 使用 TCardQueryParameters UserControl 作为 ItemTemplate 来绘制该项目,就像现在一样。

【讨论】:

  • 非常感谢。那是很多非常有用的信息。我正在做你说的最后一件事,并将一个模型添加到我的列表框中,并让它呈现用户控件。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多