2010-11-28 57 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