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いくつかの場所に置きたいと思っています。理想的には、次のようなメソッドをバッキングXAMLcsファイルに追加できるようにしたいと思います。

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

そして、どういうわけか、csファイルのメソッドでComboBoxをポイントします。


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

基本的に、PersonクラスをPropertyChanged通知を発生させるプロパティでラップします(プロパティが変更されたときに画面を更新する場合に必要です)。また、新しいFullNameプロパティを追加します。

次に、MainWindowのCode Behindページにコードを入れたくないので、MainViewModelがあります。それは私たちを宣言し、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はどちらも素晴らしいツールですが、学習曲線があります。

于 2013-03-21T16:51:49.317 に答える