2013-03-21 21 views
1

是否有要用於放置在組合框中的項目標籤功能的方法嗎?的標籤設置功能的組合框

目前它使用ToString(),以獲取標籤。舉個例子說,你有一個由Person類型的列表對象支持的ComboBox

namespace WpfApplication1 { 
    public class Person { 

     public string fname { get; set; } 

     public string mname { get; set; } 

     public string lname { get; set; } 

     public Person(string fname, string mname, string lname) { 
      this.fname = fname; 
      this.mname = mname; 
      this.lname = lname; 
     } 

     public override string ToString() { 
      return this.lname +", " + this.fname + " "+ this.mname; 
     } 
    } 
} 

但現在要在文本每個人只是this fname + " "+ this.mname[0]+" "+this.lname在一些地方。我非常希望能夠將方法添加到支持XAML文件CS一樣:

public string GetLabel(Person item) { 
    return item.fname + " " + item.mname[0] + " " + item.lname; 
} 

然後以某種方式指向它在CS文件的方法組合框。


下面是一個示例XAML文件和XAML.cs如果是任何幫助:
MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="100" Width="250"> 
    <Grid> 
     <ComboBox x:Name="items" Height="22" Width="200" ItemsSource="{Binding}"/> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

using System.Collections.Generic; 
using System.Windows; 

namespace WpfApplication1 { 
    public partial class MainWindow : Window { 

     public List<Person> persons { get; set; } 

     public MainWindow() { 
      InitializeComponent(); 
      this.persons = new List<Person>(); 
      persons.Add(new Person("First", "Middle", "Last")); 
      persons.Add(new Person("John", "Jacob", "Jingleheimer")); 
      persons.Add(new Person("First", "Middle", "Last")); 

      this.items.DataContext = this.persons; 
     } 


     public string GetLabel(Person item) { 
      return item.fname + " " + item.mname[0] + " " + item.lname; 
     } 
    } 
} 
+0

考慮將函數名稱ItemLabel更改爲GetLabel()。這會更有意義嗎? – David 2013-03-21 16:31:17

+0

@David GetLabel()是一個更好的名字 – 2013-03-21 16:35:42

+1

你有沒有考慮過使用mvvm? – 2013-03-21 16:38:00

回答

1

你應該看看使用ViewModel來使這個更直接,但如果你想做你自己再問你可以在你的ComboBox上綁定你的Person類。

public class Person 
{ 
    public string fname { get; set; } 
    public string mname { get; set; } 
    public string lname { get; set; } 

    public string FullName 
    { 
     get 
     { 
      return item.fname + " " + item.mname[0] + " " + item.lname; 
     } 
    } 

    public Person(string fname, string mname, string lname) 
    { 
     this.fname = fname; 
     this.mname = mname; 
     this.lname = lname; 
    } 
} 

然後,你可以使用這個XAML:

<ComboBox x:Name="items" Height="22" Width="200" ItemsSource="{Binding} DisplayMemberPath="FullName"/> 

我再次建議你瞭解更多關於MVVM。

我希望這會有所幫助。


編輯

好吧,你問我能告訴你如何使用MVVM做到這一點,所以在這裏不言而喻。

首先,我們有我們的Person類,這是我們的模型(我改名的屬性和因爲我可以添加一個ID字段)

public class Person 
{ 
    public Guid Id { get; set; } 
    public string FirstName { get; set; } 
    public string MiddleName { get; set; } 
    public string LastName { get; set; } 

    public Person() 
    { 
     Id = Guid.NewGuid(); 
    } 

    public Person(string firstName, string middleName, string lastName) 
    { 
     Id = Guid.NewGuid(); 
     FirstName = firstName; 
     MiddleName = middleName; 
     LastName = lastName; 
    } 
} 

注意,我沒有污染我的模型與FullName屬性,因爲這是純粹是爲了顯示,所以我們將它放在ViewModel中。

這裏是PersonViewModel(注意在這種情況下ViewModelBase僅僅是一個基類,實現了INotifyPropertyChanged):

public class PersonViewModel : ViewModelBase 
{ 
    private Person person { get; set; } 

    public Guid Id { get { return person.Id; } } 

    public String FirstName 
    { 
     get { return person.FirstName; } 
     set 
     { 
      if (person.FirstName != value) 
      { 
       person.FirstName = value; 
       RaisePropertyChanged("FirstName"); 
      } 
     } 
    } 

    public string MiddleName 
    { 
     get { return person.MiddleName; } 
     set 
     { 
      if (person.MiddleName != value) 
      { 
       person.MiddleName = value; 
       RaisePropertyChanged("MiddleName"); 
      } 
     } 
    } 

    public string LastName 
    { 
     get { return person.LastName; } 
     set 
     { 
      if (person.LastName != value) 
      { 
       person.LastName = value; 
       RaisePropertyChanged("LastName"); 
      } 
     } 
    } 

    public string FullName { get { return LastName + ", " + FirstName + " " + MiddleName; } } 

    public PersonViewModel() 
    { 
     person = new Person(); 
    } 

    public PersonViewModel(Person inPerson) 
    { 
     person = inPerson; 
    } 
} 

它基本上包裝Person類與被提高的PropertyChanged通知屬性(如果你想需要當屬性改變時更新屏幕)。它還增加了新的FullName屬性。

接下來我們有一個MainViewModel,因爲我不想把代碼放到MainWindow的Code Behind頁面中。它只是聲明我們的List<PersonViewModel>並填充它。

public class MainViewModel : ViewModelBase 
{ 
    public List<PersonViewModel> People { get; set; } 

    public MainViewModel() 
    { 
     // Get the people list from your data provider (in this case returns IEnumerable<Person>) 
     var peopleList = DataProvider.GetPeople(); 

     // Wrap each person in a PersonViewModel to make them more UI friendly 
     People = peopleList.Select(p => new PersonViewModel(p)).ToList(); 
    } 
} 

最後,我們有我們的主窗口ComboBox就可以了。

<Window x:Class="MVVM_Sample.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:MVVM_Sample.ViewModels" 
    Title="MainWindow" Height="350" Width="525" 
    DataContext="{DynamicResource ViewModel}"> 
<Window.Resources> 
    <vm:MainViewModel x:Key="ViewModel" /> 
</Window.Resources> 
<Grid> 
    <ComboBox ItemsSource="{Binding People}" DisplayMemberPath="FullName" SelectedValuePath="Id" Height="22" Width="200" /> 
</Grid> 
</Window> 

請注意,我在參考資料申報MainViewModel實例,並將其設置爲窗口的DataContext。這使得我的Binding語句查看MainViewModel的值。

我知道,對於這樣一個簡單的例子,這似乎有點冗長,但當情況開始變得複雜時,它會更有意義,它有助於保持所需的關注點分離。 MVVM和XAML都是很棒的工具,但是有一條學習曲線。

+0

如果您碰巧需要時間將上述示例轉換爲MVVM示例,那麼將不勝感激。我認爲這會爲我清除很多東西。 – 2013-03-21 16:58:04

+0

很難將一個像MVVM這樣的概念簡化爲一個微不足道的例子,但我會考慮可以做些什麼。 – 2013-03-21 19:25:59

+0

你走了。我在我的答案中添加了一個示例。 – 2013-03-21 20:01:03