1

有没有办法为放置在组合框中的项目使用标签功能?

目前它使用ToString()来获取标签。例如,假设您有一个ComboBox由类型列表对象支持的Person

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;
}

然后以某种方式将 ComboBox 指向 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>

主窗口.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;
        }
    }
}
4

1 回答 1

1

您应该考虑使用 ViewModel 来使这更直接,但是如果您想做您所要求的,您可以在您的Person类上创建另一个属性,您绑定到您的 ComboBox 上。

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;
    }
}

它基本上用引发 PropertyChanged 通知的属性包装了我们的 Person 类(如果您想在属性更改时更新屏幕,则需要)。它还添加了新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();
    }
}

最后,我们有我们的 MainWindow 和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请注意,我在 Resources 中声明了一个实例并将其设置DataContext为 Window。这使我的 Binding 语句在 MainViewModel 中查找值。

我知道对于这样一个简单的例子来说这似乎有点冗长,但是当事情开始变得复杂时它会更有意义,它有助于保持所需的关注点分离。MVVM 和 XAML 都是很棒的工具,但是有一个学习曲线。

于 2013-03-21T16:51:49.317 回答