2012-03-08 88 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}"/>