Привязать источник выпадающих списков к определенному свойству этих объектов - PullRequest
1 голос
/ 31 октября 2019

Скажем, у меня есть список объектов TeamParameter, которые имеют свойство name и id. Я хочу иметь комбо-бокс, который будет показывать список объектов TeamParameter, но отображать только свойство имени каждого из них в комбо-боксе для пользователя. Есть ли способ связать это свойство в MainWindow.xaml?

Обозначение пробной точки, думая, что оно будет работать, но нет.

MainViewModel.cs

public class MainViewModel : ViewModelBase
{
        private List<TeamParameters> _teams;

        public class TeamParameters
        {
            public string Name { get; set; }

            public int Id { get; set; }
        }

        public List<TeamParameters> Teams
        {
            get { return _teams; }
            set { Set(ref _teams, value); }
        }
}

MainWindow.xaml

<Window x:Class="LiveGameApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LiveGameApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        DataContext="{Binding Main, Source={StaticResource Locator}}">



    <DockPanel>
        <ComboBox  Name="TeamChoices" ItemsSource="{Binding Team.Name}"  DockPanel.Dock="Top" Height="30" Width="175" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"></ComboBox>
    </DockPanel>
</Window>

1 Ответ

1 голос
/ 31 октября 2019

Чтобы указать конкретное свойство в модели данных, вы можете указать путь к члену, задав DisplayMemberPath:

<ComboBox  ItemsSource="{Binding Teams}" DisplayMemberPath="Name" />

Когда вы не указали DataTemplate и не указалиНе указывайте DisplayMemberPath для элементов ItemsControl, элемент управления по умолчанию отображает представление string элемента. Это делается путем вызова Object.ToString() для каждого элемента. Поэтому в качестве альтернативы вы всегда можете переопределить Object.ToString() типа TeamParameters (или модель изделия в целом):

public class TeamParameters
{
  public override string ToString() => this.Name;

  public string Name { get; set; }

  public int Id { get; set; }
}

XAML

<ComboBox  ItemsSource="{Binding Teams}" />

Илипросто укажите DataTemplate:

<ComboBox ItemsSource="{Binding Teams}">
    <ComboBox.ItemTemplate>
        <DataTemplate DataType="TeamParameters">
            <TextBlock Text="{Binding Name}" /> 
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
...