MVVM:我如何只将属性读入ViewModel?

时间:2013-12-05 21:21:33

标签: c# xaml mvvm

我有一个简单的问题,但我有点无法解决。 我正在使用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的实例 - 为什么呢?

感谢您的帮助!

1 个答案:

答案 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;
}