2010-11-28 68 views
0

的具体信息我公司目前拥有包含下列属性是否包括视图模型

public class Chromosome 
{ 
    public int Length 
    { 
     get; 
     set; 
    } 

    public int Number 
    { 
     get; 
     set; 
    } 

    public Chromosome(int _length, int _number) 
    { 
     Length = _length; 
     Number = _number; 
    } 
} 

我有绑定到我的视图模型的列表框数据的类。项目源是绑定到染色体对象的Observable的数据。染色体列表

<Grid> 
     <ListBox Style="{StaticResource ListBoxStyle}" 
       ItemsSource="{Binding Path=ChromosomeList}" 
       ItemTemplate="{StaticResource ChromosomeDataTemplate}"> 
     </ListBox> 
    </Grid> 

ItemTemplate中的列表框中的项目是ChromosomeDataTemplate,如下所示。

<DataTemplate x:Key="ChromosomeDataTemplate"> 
    <Border> 
     <Grid Height="10"> 
      <TextBlock VerticalAlignment="Bottom" 
         Text="{Binding Number}"> 
      </TextBlock> 
     </Grid> 
    </Border> 

在这种情况下,我想对电网的高度属性被数据绑定到染色体的长度财产。然而,由于长度是非常大的,我需要它是实际值的一小部分。我可以这样做:

  • 制作一个新的属性具体的修改高度

不过,我觉得这不遵循MVVM模式。数据绑定时有什么办法修改长度值吗?

回答

3

Chromosome是你的模型。您的XAML代码驻留在您的视图中。假设的“修改长度”值应该驻留在ViewModel中。

对于修改高度的新属性不是MVVM(当然这是一个非常糟糕的主意),您是正确的。

为了更好的方法,您通常会将修改长度属性放在ViewModel中。然而,你的问题是现在你的ViewModel有ObservableCollection<Chromosome>,因此不能为每个Chromosome实例提供一个简单的修改长度属性。

因此,你有两个选择:

  1. 实现一个ValueConverter是将初始Length到appopriate Grid.Height。这可能是在您的ViewModel或视图,但我认为把它放在ViewModel是不合适的(因为它将被一个特定的视图使用)。这是最简单的方法。

  2. 将每个Chromosome包装在它自己的ViewModel中,例如, ChromosomeViewModel。您现有的ViewModel将收集Chromosome s并揭示ObservableCollection<ChromosomeViewModel>。然后,您将创建绑定到每个ViewModel的ChromosomeView,这基本上就是您现在在ChromosomeDataTemplate中所拥有的。由于ChromosomeView将绑定到ChromosomeViewModel,后者又包装单个Chromosome,您现在可以直接在ChromosomeViewModel中提供“修改长度”属性。

如果只是为了这个,我建议去ValueConverter。但是,对于更复杂的场景,请记住第二种方法。

+0

它只是为了这个。我将在View Models中封装未来的集合。 – 2010-11-28 16:27:41

0

为什么不在这里使用转换器?见例如MSDN