我有一个简单的问题,但我有点无法解决。 我正在使用C#和XAML以及MVVM-Light工具包编写Windows 8.1应用程序。
我想要做的是在ViewModel中获取HubSections高度,以便能够用它进行一些计算。
我该怎么做?
我尝试了几个绑定,但每次将HubSections的Height属性绑定到后面的某个属性时,都会设置为零。
对不起,这似乎是一个简单的问题..
到目前为止非常感谢你!
编辑(进一步资料):
情况:我有一个Hub-Section,其中有一个GridView。应该在运行时计算GridView中项目的高度,以便它们始终都适合屏幕。
HubSection高度属性:
<HubSection x:Name="SceduleSection" [...]
Height="{Binding Main.HubSectionsHeight, Source={StaticResource Locator}}">
GridView绑定到:
<GridView [...] Height="{Binding ActualHeight, ElementName=SceduleSection, Mode=OneWay}" [...]/>
我希望能够在ViewModel中拥有以下Property的Height属性:
public const string HubSectionsHeightPropertyName = "HubSectionsHeight";
private double _HubSectionsHeight;
public double HubSectionsHeight
{
get
{
return _HubSectionsHeight;
}
set
{
if (_HubSectionsHeight == value)
{
return;
}
RaisePropertyChanging(HubSectionsHeightPropertyName);
_HubSectionsHeight = value;
RaisePropertyChanged(HubSectionsHeightPropertyName);
}
}
但是值设置为0。
编辑2(解决方案使用触发器;投射问题)
我已经实现了McGarnagle的想法并想出了以下内容:
触发:
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Loaded">
<Core:CallMethodAction TargetObject="{Binding Main, Source={StaticResource Locator}}"
MethodName="UpdateSize" />
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
方法“UpdateSize”:
public void UpdateSize(object sender, RoutedEventArgs args)
{
HubSectionsHeight = ((HubSection)sender).Height;
}
阐释:
我希望在页面加载时获得HubSection的高度,以便能够使用它。这就是为什么我修改了“Loaded”事件。
现在我的问题是“UpdatedSize”方法中的“sender”不包含实际的发件人。而不是它包含MainViewModel的实例 - 为什么呢?
感谢您的帮助!
答案 0 :(得分:1)
我过去曾使用Blend SDK来做这种事情(非常有用)。使用EventTrigger
结合CallMethodAction
:
<HubSection
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
...>
<i:Triggers>
<i:EventTrigger EventName="SizeChanged">
<ei:CallMethodAction
TargetObject="{Binding Main, Source={StaticResource Locator}}"
MethodName="UpdateSize" />
</i:EventTrigger>
</i:Triggers>
</HubSection>
然后视图模型接收可用于更新属性的事件:
public void UpdateSize(object sender, SizeChangedEventArgs args)
{
HubSectionsHeight = args.NewSize.Height;
}