使用MVVM设计模式为控件分离数据对象变量

本文关键字:数据 对象 变量 分离 控件 MVVM 设计模式 使用 | 更新日期: 2023-09-27 18:18:26

假设有一个数据对象,它包含两个值CompanyIDPrice。此外,我有一个以上的控制,这取决于CompanyID应该更新价格

有四个相同布局的网格,每个布局都包含一个<TextBlock/>控件。所有控件共享相同的变量(Price)。如果我将<TextBlock Text="{Binding Price}"/>放在四个布局中的每个布局中,相同的值将在每个控件上更新。它应该根据给定的CompanyID只更新一个<TextBlock/>。价格将在运行时更新。

在modelView构造函数中:

PriceObj = new Model(CompanyID, Price);

对象将存储在属性(PriceObj)中,该属性由modelView拥有。

根据CompanyID值,区分哪个控件应该更新Price值的最佳实践是什么?

为每个公司创建不同的Price,让我们说Price0Price1,然后通过XAML中的DataBinding直接访问这些值会更好吗?

能否在INotifyPropertyChanged接口实现中做出区分?

注意:我不想要最简单的方法,我想要最适合MVVM模式的方法。代码示例将不胜感激。

使用MVVM设计模式为控件分离数据对象变量

如果你有100家公司,每家公司都有自己的价格,那么生产Price0的效率非常低…Price99属性。这不是关于MVVM,这是关于常识。

显然,方法是在视图模型级别收集PriceObj,在视图级别收集ItemsControl。像这样:

public PriceObj
{
    public int CompanyID { get; set; }
    public decimal Price { get; set; }
}
public class PriceEditorViewModel
{
     public ObservableCollection<PriceObj> Prices { ... }
     /* ... */
}
XAML:

<ListBox ItemsSource="{Binding Prices}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding CompanyID}"/>
                <TextBox Text="{Binding Price}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

ItemsControl(示例中的ListBox)在ItemsSource中为每个项目生成一组单独的控件。在上面的标记中,控件是使用DataTemplate定义的(这里有更多关于数据模板的信息)。

我不完全理解你的问题,但我猜你有公司及其价格列表,你想在人们选择公司时显示价格?如果是这样的话,我会创建两个网格,一个用于公司,另一个用于价格。我还将在视图模型中创建公司和价格列表,每当有人选择公司时,我将在视图模型中过滤价格列表。

可能是我没听懂你的qq。