【问题标题】:Compare objects to set selected value in pre-loaded combobox silverlight MVVM比较对象以在预加载的组合框 silverlight MVVM 中设置选定值
【发布时间】:2011-06-20 16:34:07
【问题描述】:

我正在尝试使用 silverlight 和 MVVM 将选定值设置为预加载的组合框。

我在选择值之前加载这些组合框项。

例如,我有一个用于选择国家/地区的组合框。我的第一步是加载一个绑定到组合框源的列表。这是完美的加载。

在此之后,我有一个“SelectedCountry”对象以双向绑定方式绑定到组合框的 selectedItem。

当我选择任何组合框值并且我的 SelectedCountry 对象被正确选择时,这是完美的。

当我尝试在我的 ViewModel 中分配选定的值时,问题就出现了。这样,组合框选定项不会更新。

我想这是因为,事实上,它们不是同一个对象(它们具有相同的值但它们是不同的引用)。

如果我重新实现 equals 方法,这应该可行吗?或者我应该通过搜索列表找到相同的对象?这将非常容易,因为如果这两个国家具有相同的 id,它们将是相同的......但我可以有更复杂的对象,我认为 equals 方法会更好。

提前致谢!!

编辑以添加一些代码示例:

<ComboBox Grid.Column="7" Margin="6,0" Name="cBTipoPoliza" VerticalAlignment="Center" TabIndex="4" ItemsSource="{Binding TiposPolizas, Mode=OneWay}" SelectedItem="{Binding TipoPoliza,  Mode=TwoWay}">
 <ComboBox.ItemTemplate>
       <DataTemplate>
            <TextBlock Text="{Binding nombre_tipo}" />
       </DataTemplate>
 </ComboBox.ItemTemplate>

【问题讨论】:

    标签: silverlight mvvm


    【解决方案1】:

    通常我只是重写 .Equals() 方法来检查它们是否通过 ID 或名称相等

    【讨论】:

    • 这也意味着要覆盖 HashCode 和 operator =。当您使用它时,覆盖运算符!=
    • 我已经尝试过了,但没有任何改变......你确定在我分配我的“selectedValue”对象时评估了equals方法吗?
    • 我已经添加了 ComboBox 代码。我想我是按照你说的方式做的。
    • 我正在使用的对象是服务提供的对象,因此我将尝试制作本地副本以在客户端对象中设置断点。感谢您的所有帮助;-)
    【解决方案2】:

    您应该尽量避免在内存中同时拥有同一对象的多个副本。一种方法是让您的虚拟机成为对象的来源。当您加载列表时,让 VM 执行此操作并在您的 ComboBox 可以绑定到的 VM 上公开 AvailableCountries ObservableCollection 属性。

    如果您的对象基于 ID 在语义上相等,请务必覆盖 Equals 和 == 和 != 以及哈希码。但是要小心,因为如果您要让人们更新对象,您可能会遇到冲突(即使在应用程序的同一实例中),其中一个屏幕会保留过时的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      相关资源
      最近更新 更多