2012-03-08 75 views
0

我有一个包含一个ItemControl标签的XAML页面(应用程序使用MVVM光框架):ItemControl未绑定对象正确

<ItemsControl MinWidth="100" MinHeight="25" ItemsSource="{Binding Path=Options}" HorizontalAlignment="Left" d:LayoutOverrides="Height" Margin="10,0"> 
    <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

这种控制有是列表中的项目源选项对象。此项目的控制数据模板如下:

<DataTemplate DataType="{x:Type Sales:Option}"> 
    <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/> 
</DataTemplate> 

我有一个与SalesOptionButton控制是如下相关的视图模型:

公共类SalesOptionButton { 私人字符串_name; private Option _Option;

public ICommand SelectedOptionButtonCommand { get; set; } 

    public string Name 
    { 
     get { return _name; } 
     set { SetStructPropertyValue(ref _name, value); } 
    } 

    public Option Option 
    { 
     get { return _scriptOption; } 
     set { SetPropertyValue(ref _scriptOption, value); } 
    } 

    public SalesScriptOptionButton(ScriptOption option) 
    { 
     Option = option; 
     Name = option.OptionText; 
    } 

    protected override void RegisterForMessages() 
    { 
     SelectedOptionButtonCommand = new RelayCommand(OptionButtonSelected); 
    } 

    private void OptionButtonSelected() 
    { 
     MessengerService.Send(ScriptOptionSelectedMessage.Create(ScriptOption)); 
    } 

    protected override void SetDesignTimeInfo(){} 
} 

下面是选项控制的XAML:

<UserControl [INCLUDES]> 
    <Button Height="25" Padding="1" MinWidth="100" Content="{Binding Name}" Command="{Binding SelectedOptionButtonCommand}"/> 
</UserControl> 

这样做是什么,为每个在数据源,创建一个按钮选项。这些按钮应该显示选项的名称,并且当单击该按钮时,将消息发送到将处理该点击的主应用程序(设置选择的选项)。

我看到的问题是正在创建按钮,但没有其他任何被绑定(没有选项名称显示在按钮上,并且按钮单击不起作用)。任何人都可以给我一个想法,为什么这不像我认为它应该是?

+0

你在哪里定义:'' – 2012-03-08 22:54:38

回答

0

您没有将数据模板设置为项目控件的属性。

<ItemsControl ItemTemplate={StaticResource OptionTemplate} .../> 

<DataTemplate x:Key="OptionTemplate" DataType="{x:Type Sales:Option}"> 
    <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/> 
</DataTemplate> 
+0

其实你不该不需要。他们已经指定了类型,并且ItemControl应该在不需要明确指定模板的情况下进行选择。 – 2012-03-08 21:59:18

+0

这不起作用。我收到以下异常:找不到名为'OptionTemplate'的资源。资源名称区分大小写。 – 2012-03-08 22:00:52

+0

你可能是对的,但我觉得明确要更安全。我希望看到* Options *属性的定义。 – Phil 2012-03-08 22:02:08

0

当代码的部分代码看起来丢失时,很难破译您的帖子。你说:

此控件有一个项目源是一个选项对象列表。此项目的控制数据模板如下:

<DataTemplate DataType="{x:Type Sales:Option}"> 
    <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/> 
</DataTemplate> 

你还没有告诉我们您的Option类 - 只有你SalesOptionButton类。据推测,你的Option类型有一些财产,产生相关的SalesOptionButton实例?如果是这样的话,那么你的数据模板是错在这里:

<local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/> 

你的SalesOptionButtonDataContext设置为Option实例,而不是到SalesOptionButton实例。我猜(我要)你想是这样的:

<local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding SalesOptionButton}"/>