简体   繁体   English

绑定到ComboBox将显示模型名称而不是属性内容

[英]Binding to ComboBox displays Model name instead of property contents

I've set up the binding for a combo box using a property in the ViewModel. 我已经使用ViewModel中的属性设置了组合框的绑定。 But when I debug the app on a device, the contents of the combo box is just the Model name for each index like LC_Points.Model.Grade . 但是,当我在设备上调试应用程序时,组合框的内容只是每个索引(例如LC_Points.Model.Grade的模型名称。

To debug this issue, I've gone through the following checks: 要调试此问题,我经过了以下检查:

  • Check property is public 检查财产是公共的
  • Check Lists aren't empty 检查清单不为空
  • Check correct binding name as in VM 检查与VM中相同的绑定名称

Does anyone know how to fix this binding issue? 有人知道如何解决此绑定问题吗?

The ViewModel containing the Lists is set up like this: 包含列表的ViewModel设置如下:

namespace LC_Points.ViewModel
{

    public class MainViewModel : ViewModelBase
    {

        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            //call methods to initilise list data
            GetGradeTypes();
            GetSubjectTypes();

        }


        public List<Grade> grades { get; set; }
        public List<Grade> subjects { get; set; }

        public void GetGradeTypes()
        {
            List<Grade> gradeList = new List<Grade>();

            // Adding Grades to List
            gradeList.Add(new Grade { grade = "A1" });
            gradeList.Add(new Grade { grade = "A2" });
            gradeList.Add(new Grade { grade = "B1" });
            gradeList.Add(new Grade { grade = "B2" });
            gradeList.Add(new Grade { grade = "B3" });
            gradeList.Add(new Grade { grade = "C1" });
            gradeList.Add(new Grade { grade = "C2" });
            gradeList.Add(new Grade { grade = "C3" });
            gradeList.Add(new Grade { grade = "D1" });
            gradeList.Add(new Grade { grade = "D2" });
            gradeList.Add(new Grade { grade = "D3" });
            gradeList.Add(new Grade { grade = "E,F,NG" });
            gradeList.Add(new Grade { grade = "Pass" });
            gradeList.Add(new Grade { grade = "Merit" });
            gradeList.Add(new Grade { grade = "Distinction" });


            grades = gradeList;

        }


        public void GetSubjectTypes()
        {
            List<Grade> subjectList = new List<Grade>();

            // Adding Subjects to List
            subjectList.Add(new Grade { subject = "Accounting" });
            subjectList.Add(new Grade { subject = "Agricultural Economics" });
            subjectList.Add(new Grade { subject = "Agricultural Science" });
            subjectList.Add(new Grade { subject = "Ancient Greek" });
            subjectList.Add(new Grade { subject = "Applied Math" });
            subjectList.Add(new Grade { subject = "Arabic" });
            subjectList.Add(new Grade { subject = "Art" });
            subjectList.Add(new Grade { subject = "Artistic & Creative Group" });
            subjectList.Add(new Grade { subject = "Biology" });
            subjectList.Add(new Grade { subject = "Business" });
            subjectList.Add(new Grade { subject = "Business Group" });
            subjectList.Add(new Grade { subject = "Chemistry" });
            subjectList.Add(new Grade { subject = "Classical Studies" });
            subjectList.Add(new Grade { subject = "Construction Studies" });
            subjectList.Add(new Grade { subject = "Design & Comm Graphics" });
            subjectList.Add(new Grade { subject = "Economics" });
            subjectList.Add(new Grade { subject = "Engineering" });
            subjectList.Add(new Grade { subject = "English" });
            subjectList.Add(new Grade { subject = "French" });
            subjectList.Add(new Grade { subject = "Geography" });
            subjectList.Add(new Grade { subject = "German" });
            subjectList.Add(new Grade { subject = "Hebrew Studies" });
            subjectList.Add(new Grade { subject = "History" });
            subjectList.Add(new Grade { subject = "Home Economics" });
            subjectList.Add(new Grade { subject = "Irish" });
            subjectList.Add(new Grade { subject = "Italian" });
            subjectList.Add(new Grade { subject = "Japanese" });
            subjectList.Add(new Grade { subject = "Languages & Humanities" });
            subjectList.Add(new Grade { subject = "Latin" });
            subjectList.Add(new Grade { subject = "Link Modules" });
            subjectList.Add(new Grade { subject = "Mathematics" });
            subjectList.Add(new Grade { subject = "Music" });
            subjectList.Add(new Grade { subject = "Other Language" });
            subjectList.Add(new Grade { subject = "Physics" });
            subjectList.Add(new Grade { subject = "Physics & Chemistry" });
            subjectList.Add(new Grade { subject = "Practical Group" });
            subjectList.Add(new Grade { subject = "Religious Education" });
            subjectList.Add(new Grade { subject = "Russian" });
            subjectList.Add(new Grade { subject = "Science Group" });
            subjectList.Add(new Grade { subject = "Social Group" });
            subjectList.Add(new Grade { subject = "Spanish" });
            subjectList.Add(new Grade { subject = "Technology" });

            subjects = subjectList;

        }

    }
}

And I've set up the binding in the MainPage View like this: 我已经在MainPage视图中设置了绑定,如下所示:

<Page x:Class="LC_Points.MainPage"
      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:local="using:LC_Points"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
      DataContext="{Binding Source={StaticResource Locator}}"
      mc:Ignorable="d">



    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="40*" />
            <RowDefinition Height="20*" />
            <RowDefinition Height="30*" />
            <RowDefinition Height="30*" />
            <RowDefinition Height="20*" />
            <RowDefinition Height="20*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="4.5*" />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>


        <ComboBox x:Name="subjectCmbBx"
                  Grid.Row="1"
                  Grid.ColumnSpan="2"
                  Width="174"
                  HorizontalAlignment="Left"
                  VerticalAlignment="Top"
                  ItemsSource="{Binding subjects}" />
        <ComboBox x:Name="gradeCmbBx"
                  Grid.Row="1"
                  Grid.Column="0"
                  Grid.ColumnSpan="2"
                  Width="70"
                  HorizontalAlignment="Right"
                  ItemsSource="{Binding grades}" />
    </Grid>

</Page>

The output during debug looks like this: 调试期间的输出如下所示:

调试组合框

Unless you provide a DisplayMemberPath ( https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.displaymemberpath%28v=vs.110%29.aspx ), which is what I would recommend doing, then it will use the provided implementation of Grade::ToString() . 除非您提供DisplayMemberPathhttps://msdn.microsoft.com/zh-cn/library/system.windows.controls.itemscontrol.displaymemberpath%28v=vs.110%29.aspx ),否则我建议这样做,则它将使用提供的Grade::ToString() So, you could alternatively override that. 因此,您可以选择覆盖它。

You need to tell the ComboBox how to display its items. 您需要告诉ComboBox如何显示其项目。 Otherwise it will just call ToString() on the bound item and display something wonky. 否则,它将仅在绑定的项目上调用ToString()并显示一些异常。

There are three ways to get reasonable output: 有三种方法可获得合理的输出:

  1. Define a reasonable ToString() on your DataObject. 在您的DataObject上定义一个合理的ToString()。 This is a good idea even if you do one of the others since Narrator will read this if you don't otherwise set accessibility information. 即使您执行其他操作,这也是一个好主意,因为如果没有另外设置辅助功能信息,则讲述人将阅读此内容。

  2. Define the DisplayMemberPath on the ComboBox to point to the property you want displayed. 在ComboBox上定义DisplayMemberPath ,以指向要显示的属性。

<ComboBox x:Name="subjectCmbBx"
          Grid.Row="1"
          Grid.ColumnSpan="2"
          Width="174"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
          DisplayMemberPath="Name"
          ItemsSource="{Binding subjects}" />
  1. Define an ItemTemplate for the ComboBox to completely control how each item is displayed. 为ComboBox定义一个ItemTemplate,以完全控制每个项目的显示方式。 This will allow displaying multiple properties from the bound object, formatting, and a much better UI than just plain text. 这将允许显示绑定对象的多个属性,格式以及比纯文本更好的UI。 You can generate an empty template by right clicking on the ComboBox in the designer and choosing Edit Additional Templates.Edit Generated Items (ItemTemplate)... then filling it out as desired: 您可以通过在设计器中的ComboBox上单击鼠标右键,然后选择Edit Additional Templates.Edit Generated Items(ItemTemplate)...来生成一个空模板,然后根据需要将其填充:
<ComboBox x:Name="subjectCmbBx"
          Grid.Row="1"
          Grid.ColumnSpan="2"
          Width="174"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
          ItemsSource="{Binding subjects}" >
    <ComboBox.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Source="{Binding Picture}" Grid.Column="0" />
                <TextBlock Text="{Binding Name}" Grid.Column="1" />
            </Grid>
        </DataTemplate>
    </ComboBox.Resources>
    <ComboBox.ItemTemplate>
        <StaticResource ResourceKey="DataTemplate1"/>
    </ComboBox.ItemTemplate>
</ComboBox>

I'd recommend #1 (as a minimum for accessibility) and #3 for most cases. 在大多数情况下,我建议#1(可访问性的最低要求)和#3。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM