我正在尝试使用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>
我需要一些语法来指定样本数据,说明“这是一个具有此名称和此值的动态属性”。
我该怎么做?它甚至可能吗?
答案 0 :(得分:3)
我不确定,但我猜您需要为您的班级设置ContentPropertyAttribute。而不是把你的价值观放在标签的内容上。
<vm:GarageDoorsViewModel.Items>
<prem:PremiseObject>
<object x:Key="key"/>
</prem:PremiseObject>
</vm:GarageDoorsViewModel.Items>