我正在處理使用WPF和MVVM顯示罐中液體水平的顯而易見的簡單問題。如何從ViewModel轉換信息以顯示在視圖中
爲了顯示一個坦克,我使用了一個帶有矩形的DockPanel。矩形的高度根據儲罐中的液體量而變化。在坦克的頂部,我有一個TextBlock,顯示坦克中存在的液體數量。 我在XAML定義這個是這樣的:
<DockPanel x:Name="tankView" HorizontalAlignment="Left" Height="212" VerticalAlignment="Top" Width="144" DataContext="{Binding Source={StaticResource TankViewModel}}">
<TextBlock x:Name="oilQuantity" HorizontalAlignment="Right" VerticalAlignment="Top" DockPanel.Dock="Top" Margin="0,0,10,0" Text = "{Binding TxtOilQuantity, Mode=OneWay}"/>
<Rectangle x:Name="oilLevel" Fill="Green" Height="66" Stroke="Black" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" DockPanel.Dock="Bottom"/>
</DockPanel>
你也可以看到,我創建了一個TankViewModel類和TankModel類,MVVM模式下。
顯示TextBlock中的液體數量很簡單,並且數據綁定完美地完成了這項工作。但是,當涉及到矩形的高度時,會出現一些問題,因爲我無法找到正確分離視圖和ViewModel之間關係的方法。
Rectangle的高度取決於最大容量和存在的液體在坦克的數量,這樣我可以得到一個數字,告訴我在什麼比例的坦克被填滿,這樣的:
public class TankViewModel : INotifyPropertyChanged
{
private TankModel tankModel = new TankModel(2500);
public int IntFilledPercentage {
get {
if (tankModel.OilQuantity == 0)
return 0;
else
return Convert.ToInt32(((double)tankModel.OilQuantity/tankModel.capacity) * 100);
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
但是,我無法將此屬性直接綁定到矩形的高度,併爲這樣的屬性賦予值聽起來像視圖應該負責的事情。 爲了實現這一點,我將不得不在視圖中插入一些代碼,將此百分比值轉換爲矩形的高度。
我可以通過實現視圖的OnPropertyChanged()回調來實現這一點嗎?
對於如何簡化我所採用的架構,您有什麼建議嗎?
標誌着我這是接受的解決方案,因爲我要考慮到容器的實際高度而不是硬編碼它。 Rory和toadflakz的答案也非常有幫助,謝謝! – Perennialista