如何为[]属性定义XAML示例数据

时间:2014-02-18 00:56:31

标签: c# xaml windows-phone-8

我正在尝试使用XAML示例数据,其中我的'item'类通过定义[]的属性访问器来使用动态属性的形式。它(PremiseObject)就是这样的:

...
/// <summary>
/// Property accessor. Simulates a dynamic object.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public object this[string name] {
    get {
        PremiseProperty prop;
        if (_properties.TryGetValue(name, out prop))
            return prop.Value;

        // In XAML <Button Content="Trigger" Command="{Binding [TriggerCommand]}">
        // where 'Trigger' is the name of hte property that is momentary
        if (name.EndsWith("Command")) {
            string cmd = name.Substring(0, name.Length - "Command".Length);
            if (_properties.TryGetValue(cmd, out prop)) {
                return new PremiseCommand(this, cmd);
            }
        }

        return null;
    }
    set {
        SetMember(name, value);
    }
}
... 

别介意中间的goop。关键是在我的XAML中我可以做这样很酷的事情:

<ListBox x:Name="DoorsListBox" Margin="0,0,-12,0" 
         ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="0,0,0,35">
                <StackPanel>
                    <!-- We use Description instead of DisplayName because DisplayName changes for GDOs. -->
                    <TextBlock TextAlignment="Left" TextWrapping="NoWrap" Width="320"
                               Text="{Binding [Description]}" Style="{StaticResource PhoneTextTitle2Style}"
                                />
                    <TextBlock TextAlignment="Left" TextWrapping="NoWrap" Width="320"
                               Text="{Binding [GarageDoorStatus], Converter={StaticResource GDOStateFormatConverter}}" 
                               Style="{StaticResource PhoneTextSubtleStyle}"

                               Foreground="{Binding [GarageDoorStatus], Converter={StaticResource GDOStateColorConverter}}"/>
                </StackPanel>
                <Button DataContext="{Binding}" 
                        Content="Trigger" 
                        IsEnabled="True"
                        Style="{StaticResource GDOButtonStyle}"
                        Command="{Binding [TriggerCommand]}">
                </Button>

            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我对它的工作方式非常满意。我已经尝试了几种形式的动态对象,直到我遇到这个问题,它一直都很棒。

这个问题是我不知道如何为此指定示例XAML数据。

<vm:GarageDoorsViewModel
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:PremiseWP.ViewModels"
    xmlns:prem="clr-namespace:PremiseWebClient"
    IsDataLoaded="False">

    <vm:GarageDoorsViewModel.Items>
        <prem:PremiseObject *** SOMETHING GOES HERE ***/>
    </vm:GarageDoorsViewModel.Items>

</vm:GarageDoorsViewModel>

我需要一些语法来指定样本数据,说明“这是一个具有此名称和此值的动态属性”。

我该怎么做?它甚至可能吗?

1 个答案:

答案 0 :(得分:3)

我不确定,但我猜您需要为您的班级设置ContentPropertyAttribute。而不是把你的价值观放在标签的内容上。

<vm:GarageDoorsViewModel.Items>
    <prem:PremiseObject>
        <object x:Key="key"/>
    </prem:PremiseObject>
</vm:GarageDoorsViewModel.Items>