Caliburn.Micro:绑定到列表,第一项为null

时间:2013-01-03 16:17:02

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

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

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

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

我刚刚为控件创建了一个标准的itemtemplate,我将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。奇怪但可以理解! 你的方法是什么样的?