使用MVVM设计模式为控件分离数据对象变量
本文关键字:数据 对象 变量 分离 控件 MVVM 设计模式 使用 | 更新日期: 2023-09-27 18:18:26
假设有一个数据对象,它包含两个值CompanyID和Price。此外,我有一个以上的控制,这取决于CompanyID应该更新价格。
有四个相同布局的网格,每个布局都包含一个<TextBlock/>
控件。所有控件共享相同的变量(Price)。如果我将<TextBlock Text="{Binding Price}"/>
放在四个布局中的每个布局中,相同的值将在每个控件上更新。它应该根据给定的CompanyID只更新一个<TextBlock/>
。价格将在运行时更新。
在modelView构造函数中:
PriceObj = new Model(CompanyID, Price);
对象将存储在属性(PriceObj)中,该属性由modelView拥有。
根据CompanyID值,区分哪个控件应该更新Price值的最佳实践是什么?为每个公司创建不同的Price,让我们说Price0, Price1,然后通过XAML中的DataBinding直接访问这些值会更好吗?
能否在INotifyPropertyChanged
接口实现中做出区分?
注意:我不想要最简单的方法,我想要最适合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。