【问题标题】:What should Binding Path property be set to?绑定路径属性应该设置为什么?
【发布时间】:2009-05-31 18:32:21
【问题描述】:

假设我在 C# 中有这个结构定义:

    public struct TimeSlotInfo
    {
        public int TimeSlotID;
        public int StartMin;
        public int CalcGridColumn;
        public string BackgroundCol;
        public bool ToDisable;
    }

我有一个 linq 查询:

var TimeSlotsInfo = 
from ts in datacon.TimeSlots
select new TimeSlotInfo
{
    TimeSlotID = ts.TimeSlotID,
    StartMin = ts.StartMin,
    CalcGridColumn = CalcTimeSlotGridColumn(ts.StartMin),
    BackgroundCol = ts.ColorName,
    ToDisable = false
};

如果我将 ListBox 的 ItemsSource 属性设置如下:

lstBox.ItemsSource = TimeSlotsInfo;

现在,如何设置绑定路径来引用上述查询结果中的“BackgroundCol”字段?

我尝试了 {Binding Path=TimeSlotInfo.BackgroundCol}、{Binding Path=TimeSlotInfo/BackgroundCol},最后尝试了 {Binding Path=BackgroundCol}...它们似乎都不起作用..

有人可以帮忙吗?我试图尽可能简化这个例子。希望我的问题足够清楚。 提前致谢。

【问题讨论】:

    标签: wpf binding path itemssource


    【解决方案1】:

    最后一个是正确的 ({Binding Path=BackgroundCol}) - 但是,你不能绑定到字段,你只能绑定到属性。将你的类定义为:

    class TimeslotInfo {
        public int TimeslotId {get; set;}
        /* Etc... */
    }
    

    【讨论】:

    • 我只是想到了这一点,并准备编辑我上面的帖子以包含它。 +1,你是对的!
    【解决方案2】:

    你不仅应该像 Paul 所说的那样使用属性进行绑定,而且通常你应该首先使用avoid public fields

    此外,这不应该是一个结构 - 你真的想要值类型语义吗?如有疑问,您应该默认在 C# 中创建类 - 您真的想要一个结构是非常罕见的。

    最后,即使你确实想要一个结构体,你也应该几乎总是让结构体不可变。你几乎肯定会从可变结构中得到意想不到的结果。这一切都定义明确并且有充分的理由,但这可能不是您期望的行为。可变结构是邪恶的。

    【讨论】:

    • 当您通过 LINQ 运行结构时,您甚至不会失去任何可能的结构优势吗? (即无论如何它们都会被装箱?)
    • 为什么要装箱?编译器知道要使用的适当类型。
    【解决方案3】:

    如果您希望您的项目显示存储在 BackgroundCol 中的任何内容,您只需将 ListBox 上的 DisplayMemberPath 属性设置为“BackgroundCol”。如果这不是您想要达到的目标,请更具体。

    希望这会有所帮助!

    【讨论】:

    • 啊,我不知道 - 我不认为这就是问题所在(正如我在回复中发布的那样),但这是一个很酷的捷径。
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多