Я новичок в WPF и попробовал простое раскрывающееся меню со списком ItemsSource. Мой ComboBox, к сожалению, остается пустым, а мой список должен быть в порядке.

Ребята, вы можете мне помочь?

Мой XAML:

<Window x:Class="ProjectX.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:vm="clr-namespace:ProjectX.ViewModel"
        xmlns:local="clr-namespace:ProjectX"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        DataContext="{DynamicResource ViewModelMain}">
    <Window.Resources>
        <vm:ViewModelMain x:Key="ViewModelMain"/>
    </Window.Resources>
    <Grid>
        <ComboBox ItemsSource="{Binding WaageListe}" DisplayMemberPath="{Binding Waage}" />
    </Grid>
</Window>

А вот и моя ViewModel:

using ProjectX.Model;
using System.Collections.ObjectModel;

namespace ProjectX.ViewModel
{
    public class ViewModelMain : ViewModelBase
    {
        public ObservableCollection<Waage> waageListe;
        public ObservableCollection<Waage> WaageListe
        {
            get => waageListe;
            set
            {
                RaisePropertyChanged("WaageListe");
            }
        }

        public ViewModelMain()
        {
            WaageListe = new ObservableCollection<Waage>
            {
                new Waage {Name="Hamburg - 1"},
                new Waage {Name="Hamburg - 2"},
                new Waage {Name="Hamburg - 3"},
            };
        }
    }
}
0
user8393563 23 Окт 2018 в 17:05

2 ответа

Лучший ответ

Установите DisplayMemberPath на "Имя". Вы также должны правильно установить DataContext:

<Window x:Class="ProjectX.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:vm="clr-namespace:ProjectX.ViewModel"
        xmlns:local="clr-namespace:ProjectX"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <vm:ViewModelMain />
    </Window.Resources>
    <Grid>
        <ComboBox ItemsSource="{Binding WaageListe}" DisplayMemberPath="Name" />
    </Grid>
</Window>

«Имя» - это общедоступное свойство класса Waage.

Вы также можете определить ItemTemplate:

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

Waage - это имя типа, но не имя свойства.

1
mm8 23 Окт 2018 в 14:34

Использовать это:

<Window x:Class="ProjectX.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:vm="clr-namespace:ProjectX.ViewModel"
    xmlns:local="clr-namespace:ProjectX"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
    <vm:ViewModelMain />
</Window.DataContext>
<Grid>
    <ComboBox ItemsSource="{Binding WaageListe}" DisplayMemberPath="Name"/>
</Grid>

А также:

using ProjectX.Model;
using System.Collections.ObjectModel;

namespace ProjectX.ViewModel
{
  public class ViewModelMain : ViewModelBase
  {
    public ObservableCollection<Waage> WaageListe {get;} = new ObservableCollection<Waage>();

    public ViewModelMain()
    {
       WaageListe.Add(new Waage {Name="Hamburg - 1"});
       WaageListe.Add(new Waage {Name="Hamburg - 2"});
       WaageListe.Add(new Waage {Name="Hamburg - 3"});
    }
  }
}
2
rashmatash 23 Окт 2018 в 14:29
52951076