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>
あなたは私はMVVMパターン以下、TankViewModelクラスとTankModelクラスを作成していることもわかります。
TextBlockに液体の量を表示することは簡単で、データバインディングはジョブを完全に行います。しかし、矩形の高さに関しては、Viewと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));
}
}
}
ただし、このプロパティを矩形の高さに直接バインドすることはできません。そのようなプロパティに値を与えると、Viewが担当するように聞こえるようになります。 これを達成するには、このパーセンテージ値を矩形の高さに変換するビューにコードを挿入する必要があります。
ViewのOnPropertyChanged()コールバックを実装してこれを実現できますか?
私が設置したアーキテクチャを簡素化する方法について提案がありますか?
私は、アカウントに、コンテナの実際の高さを取りたいので、私は受け入れソリューションとしてこれをマークそれをハードコーディングすることはできません。 Roryとtoadflakzの回答も非常に役に立ちました、ありがとう! – Perennialista