2015-06-02 49 views
1

我在XAML以下組合框:爲什麼它顯示類名而不是屬性?

<ComboBox x:Name="cmbCharacters1" HorizontalAlignment="Left" Margin="18,21,0,0" VerticalAlignment="Top" Width="136" SelectedIndex="0" Height="32" RenderTransformOrigin="1.53,-1.281" 
       ItemsSource="{Binding CharacterEntity}" SelectedItem="{Binding Name}" SelectedValue="{Binding Tag}"/> 

和下面的類和綁定代碼

public class CharacterEntity 
{ 
    public string Name { get; set; } 
    public string Tag { get; set; } 
} 

....

cmbCharacters1.ItemsSource = characters;//it is a List<CharacterEntity> 

當我運行它顯示類名稱而不是名稱屬性的內容,我做錯了什麼?

回答

0

我想你忘了使用這個:DisplayMemberPath="Tag"或者「名字」,無論你想顯示!

0

您需要在ComboBox XAML中設置DisplayMemberPath。

這是沒有約束力,因爲的ItemsSource已經綁定 - 你剛纔提到的字段名稱,像這樣:

<ComboBox DisplayMemberPath="Name" ... 
0

另見這個答案:https://stackoverflow.com/a/3797074/424129

C#

public class CharacterEntity 
{ 
    public string Name { get; set; } 
    public string Tag { get; set; } 
} 

// Look up how to implement INotifyPropertyChanged, I didn't bother here 
public class MyViewModel : INotifyPropertyChanged { 
    public MyViewModel(IEnumerable<CharacterEntity> chars) 
    { 
     CharacterEntities = new List<CharacterEntity>(chars); 
    } 
    private IEnumerable<CharacterEntity> _characterEntities; 
    public IEnumerable<CharacterEntity> CharacterEntities { 
     get { return _characterEntities; } 
     set { _characterEntities = value; 
       OnPropertyChanged("CharacterEntities"); } 
    } 
    private CharacterEntity _characterEntity 
    public CharacterEntity SelectedCharacterEntity 
} 

XAML

ItemsSource是酸這些項目。你的約束沒有意義。你想給它一個CharacterEntity的列表,但你綁定到CharacterEntity類?你在說什麼名單?不要將其設置在代碼後面。如果使用視圖模型,XAML更有意義。

現在,不知怎的,上面的MyViewModel類需要作爲擁有ComboBox的某個控件的DataContext

<ComboBox HorizontalAlignment="Left" Margin="18,21,0,0" 
    VerticalAlignment="Top" Width="136" SelectedIndex="0" Height="32" 
    RenderTransformOrigin="1.53,-1.281" 
    ItemsSource="{Binding CharacterEntities}" 
    SelectedItem="{Binding SelectedCharacterEntity}" 
    DisplayMemberPath="Name" 
/> 
0

在XAML您在設置的ItemsSource一類CharacterEntity代替List<CharacterEntity>,因爲你是在設置的ItemsSource代碼隱藏從XAML中刪除它和嘗試。此外,您還需要設置DisplayMemberPath="Name"並設置任何SelectedItemSelectedValue不同時,如果您使用的SelectedValue然後還用SelectedValuePath="Name"

<ComboBox x:Name="cmbCharacters1" SelectedItem="{Binding someCharacter}" DisplayMemberPath="Name" /> 
0

當你有這樣的:

SelectedItem="{Binding Path=Name}" 

它會用什麼現在在組合框中被選中,Name的類屬性被用作Selected。沒有路徑,你綁定到該組合框名稱對象。但反正,這應該不適用於Path的情況。因此,有你想要它,試試這個它的工作:

有綁定到CharacterEntity類的SelectedItem:

SelectedItem="{Binding SelectedEntity}" // Class instance of CharacterEntity 

然後你必須綁定到名稱的選定實體類物業的文字:

Text="{Binding Path=Name}" // Binded to property of Name 
SelectedValue="{Binding Path=Tag}" // Binded to property of Tag 

這樣它應該工作。您應該有一個綁定到viewmodel的組合框,並且該視圖模型應該具有SelectedEntity的屬性(CharacterEntity的類實例)。希望這有助於:

public class CharacterViewModel 
{ 
    public CharacterEntity SelectedEntity {get;set;} 
    public List<CharacterEntity> characters {get;set;} // use ObservableCollection insteand of List(Automatically update UI if list changes) 
} 

和XAML:

<ComboBox x:Name="cmbCharacters1" HorizontalAlignment="Left" Margin="18,21,0,0" VerticalAlignment="Top" Width="136" SelectedIndex="0" Height="32" RenderTransformOrigin="1.53,-1.281" 
       ItemsSource="{Binding characters}" Text="{Binding Path=Name}" SelectedItem="{Binding SelectedEntity}" SelectedValue="{Binding Path=Tag}"/> 

也有代碼隱藏例如,在構造函數中:

CharacterViewModel charViewModel = new CharacterViewModel(); 
cmdCharacters1.DataContext = charViewModel; 
cmdCharacters1.ItemsSource= charViewModel.characters; 

我在解釋這一可怕的,但我希望這是有道理的用我的代碼。

+0

我不確定如果我沒有記錯,但可能是您應該使用DisplayMemberPath而不是文本。 –

相關問題