【问题标题】:List in dropdownbox in grid does not return value网格下拉框中的列表不返回值
【发布时间】:2020-09-23 14:26:46
【问题描述】:

我有一个枚举

enum SendDays
{
    Maandag = 1,
    Dinsdag,
    Vandaag= 99
}

还有一个班级

public struct DayListModel
{
    public int Id;
    public string DayName;
}

我用这样的日子填写了一份清单

private void Filldays()
{
   foreach(int i in Enum.getValues(typeof(SendDays)))
   {
        DayListModel day =new DaylistModel()
        {
            Id = i,
            Dayname = Enum.GetName(typeof(SendDays), i)
         };
         DayList.Add(day);
   }

当我在 radcombobox 中的 Telerik RadGridView 中使用它时 喜欢

<telerik:RadComboBox ItemsSource="{Bindning DayList}" DisplayMemberPath="DayName" SelectedValue="{Bindning DefaultSendDay}" SelectedValuePath="Id"/>

每当我更改所选项目时,这都不会通过。

有什么建议吗?

杰伦

【问题讨论】:

  • SelectedValuePath 必须表示属性的名称。您的 Id 是一个字段。 DayListModel 也应该是一个类,而不是一个结构体。
  • DefaultSendDay是什么类型?
  • DefaultSendDay 是一个字节(SQL 中的 smallint,字节通过实体框架)
  • 应该和Id的类型相同,即int
  • @JeroenE:所以也将DayListModel.Id 设为byte

标签: c# wpf mvvm telerik-grid


【解决方案1】:

这是我的建议,以及我如何让它发挥作用:

  1. 就像@mm8 说的,你应该把DayListModel 变成一个类而不是一个结构,然后把fields 变成properties。如果您不使用属性,DisplayMemberPath 将不起作用。有些东西不适用于结构(例如using == to compare),所以在这种情况下我会选择一个类。

  2. 你的对象在你的视图模型中是可观察的吗?我不知道 Telerik,但您应该调用某种 PropertyChanged 方法,以便 UI 可以更新。如果你使用像MVVM light 这样的框架,它有ObservableObjects 和RaisePropertyChanged 方法。

这是一个工作示例:

MainWindowVM.cs

using GalaSoft.MvvmLight;
using System;
using System.Collections.Generic;

namespace WpfApp1
{
    public class MainWindowVM : ObservableObject
    { 
        private List<DayListModel> _DayList;
        public List<DayListModel> DayList
        {
            get { return _DayList; }
            set
            {
                if (value != _DayList)
                {
                    _DayList = value;
                    RaisePropertyChanged();
                }
            }
        }


        private DayListModel _DefaultSendDay;
        public DayListModel DefaultSendDay
        {
            get { return _DefaultSendDay; }
            set
            {
                if (value != _DefaultSendDay)
                {
                    _DefaultSendDay = value;
                    RaisePropertyChanged();
                }
            }
        }

        public MainWindowVM()
        {
            DayList = new List<DayListModel>();
            foreach (int i in Enum.GetValues(typeof(SendDays)))
            {
                DayListModel day = new DayListModel()
                {
                    Id = i,
                    DayName = Enum.GetName(typeof(SendDays), i)
                };
                DayList.Add(day);
            }
            DayList = new List<DayListModel>(DayList);
        }
    }

    public enum SendDays
    {
        Maandag = 1,
        Dinsdag,
        Vandaag = 99
    }

    public class DayListModel
    {
        public int Id { get; set; }
        public string DayName { get; set; }
    }
}


MainWindow.xaml

<Window x:Class="WpfApp1.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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindowVM />
    </Window.DataContext>

    <Grid >
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <ComboBox  ItemsSource="{Binding DayList}" SelectedItem="{Binding DefaultSendDay}" DisplayMemberPath="DayName" >
            </ComboBox>
            <TextBlock Text="{Binding DefaultSendDay.DayName}"/>
        </StackPanel>
    </Grid>
</Window>

截图:

【讨论】:

  • 感谢这个例子。将结构转换为类、将字段转换为属性以及将 DefaultSendDay 和 Id 都匹配为字节的主要问题。我接受了你的回答,因为它说明了一切。
  • 谢谢,虽然我没有将 ID 设为我的字节。您可能想明确地make the enum a byte
【解决方案2】:

确保类型匹配,即如果您的DefaultSendDay 源属性是byte,则DayListModelId 也应该是byte

如果还是不行,试着把字段转成属性,把结构转成类:

public class DayListModel
{
    public byte Id { get; set; }
    public string DayName { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多