【问题标题】:Caliburn.Micro: Bind to list with first item as nullCaliburn.Micro:绑定到列表,第一项为空
【发布时间】:2013-01-03 16:17:01
【问题描述】:

我正在使用 Caliburn.Micro 将组合框绑定到项目列表。例如,假设他们是员工。我想要第一项不是员工的(相当普遍的)行为,而是null 或其他代表什么都没有被选择的东西。

我真的不想在第一个员工被命名为“请选择”且 ID 为零的地方破解它,所以我很感激您的意见。我的偏好是列表中的第一项是null,在这种情况下,我的验证(需要选择一个值或记录未选择任何值)非常简单(我会将SelectedItem 绑定到我的视图模型上的属性。

非常感谢。

【问题讨论】:

  • 你有没有尝试过,或者这更像是一个假设的问题?
  • 到目前为止,我已经有一个 POC 与我之前提到的 hack 一起工作。我目前正在做一些事情,我有一个 IListItem 的通用列表,但实际上我将 PleaseSelectListItemViewModel 或 EmployeeViewModel 放在我绑定到的列表中,以查看 CM 是否会相应地为每个选择不同的视图。虽然代码很多,所以我很想知道是否有更简单的解决方案。
  • 好吧,我不明白为什么会有很多代码 - 这取决于(您是否需要每个组合项目的视图,或者您可以只使用标准itemtemplate?),我会发布适合我的内容

标签: .net wpf data-binding drop-down-menu caliburn.micro


【解决方案1】:

我刚刚为控件创建了一个标准项目模板,我将TextBlock 绑定到列表项DisplayName,然后我将FallbackValue 设置为一个不错的消息

<ComboBox x:Name="SomeSelection" SelectedValuePath="Value" cal:Message.Attach="[Event SelectionChanged] = [Action DroppedDown(SomeSelection)]">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayName, FallbackValue='Please select a value'}"></TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

我在虚拟机中填充项目

    // Standard property
    private ObservableCollection<SomeObject> _SomeSelection = null;
    public ObservableCollection<SomeObject> SomeSelection
    {
        get { return _SomeSelection; }
        set
        {
            if (_SomeSelection != value)
            {
                _SomeSelection = value;
                NotifyOfPropertyChange(() => SomeSelection);
            }
        }
    }

    // Instantiate and add some test items
    SomeSelection = new ObservableCollection<SomeObject>();
    SomeSelection.Add(null);
    SomeSelection.Add(new SomeObject("Hello", 0));
    SomeSelection.Add(new SomeObject("World", 1));

SomeObject 类只是一个测试类:

public class SomeObject : IHaveDisplayName
{
    public string DisplayName { get; set; }

    public int Value { get; set; }

    public SomeObject(string name, int value)
    {
        DisplayName = name;
        Value = value;
    }

}

我唯一不能工作的是默认选择“请选择一个值”项。由于列表中的第一项是空引用,因此您可能需要一个肮脏的技巧才能使其正常工作...

此外,由于 CM 对 ComboBox 的默认约定是将 SelectedItem 而不是 SelectedValue 传递给操作,因此您可以将所选项目传递给任何方法,对于 null 组合框项目,这些方法似乎是组合框项目本身而不是 null。奇怪但可以理解! 你的方法是什么样的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2013-12-08
    • 1970-01-01
    • 2017-09-24
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多