使用 MVVM 设计模式为控件分离数据对象变量
Separate dataobject variables for controls using MVVM design pattern
假设我们有一个包含两个值 CompanyID 和 Price 的数据对象。我还有多个控件,根据 CompanyID 应该更新 Price.
有四个布局相同的网格,每个布局都包含一个 <TextBlock/>
控件。所有控件共享相同的变量 (Price)。如果我将 <TextBlock Text="{Binding Price}"/>
放在四个布局中的每一个中,相同的值将在每个控件上更新。它应该只更新一个 <TextBlock/>
,具体取决于给定的 CompanyID。价格将在运行时更新。
在模型视图构造函数中:
PriceObj = new Model(CompanyID, Price);
对象将存储在 modelView 拥有的 属性 (PriceObj) 中。
区分哪个控件应更新关于 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
定义的(更多关于数据模板 here)。
我不完全理解你的问题,但我想你有公司列表和他们的价格,你想在有人选择公司时显示价格?
如果是这样,我会创建 2 个网格,一个用于公司,另一个用于价格。
我还会在视图模型中创建公司和价格列表,每当有人选择公司时,我都会在视图模型中过滤价格列表。
可能是我看不懂你的qq
假设我们有一个包含两个值 CompanyID 和 Price 的数据对象。我还有多个控件,根据 CompanyID 应该更新 Price.
有四个布局相同的网格,每个布局都包含一个 <TextBlock/>
控件。所有控件共享相同的变量 (Price)。如果我将 <TextBlock Text="{Binding Price}"/>
放在四个布局中的每一个中,相同的值将在每个控件上更新。它应该只更新一个 <TextBlock/>
,具体取决于给定的 CompanyID。价格将在运行时更新。
在模型视图构造函数中:
PriceObj = new Model(CompanyID, Price);
对象将存储在 modelView 拥有的 属性 (PriceObj) 中。
区分哪个控件应更新关于 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
定义的(更多关于数据模板 here)。
我不完全理解你的问题,但我想你有公司列表和他们的价格,你想在有人选择公司时显示价格? 如果是这样,我会创建 2 个网格,一个用于公司,另一个用于价格。 我还会在视图模型中创建公司和价格列表,每当有人选择公司时,我都会在视图模型中过滤价格列表。
可能是我看不懂你的qq