Caliburn Micro - 将项目列表绑定到 ListBox

CaliburnMicro - Binding list of items to ListBox

我需要创建一个列表来绑定由名称、布尔状态和颜色指定的项目。

这是我的 ViewModel:

using Caliburn.Micro;

public class MainWindowViewModel :Screen
{
    private List<string> _commandListSource;
    private List<CommandItem> _commandsSource;

    public List<CommandItem> CommandsSource
    {
        get
        {
            return _commandsSource;
        }

        set
        {
            _commandsSource = value;
            NotifyOfPropertyChange(() => CommandsSource);
        }
    }

    public MainWindowViewModel()
    {
        _commandListSource = new List<string>();
        _commandListSource.Add("A");
        _commandListSource.Add("B");

        getsource();

        NotifyOfPropertyChange(() => CommandsSource);
    }
    private void getsource()
    {
        _commandsSource = new List<CommandItem>();
        foreach (var x in _commandListSource)
        {
            var ci = new CommandItem();
            ci.CommandName = x;
            ci.IsInTheOtherList = true;
            _commandsSource.Add(ci);
        }
    }
}

CommandItem class:

public class CommandItem
{
    public string CommandName;
    public bool IsInTheOtherList;
    public Color BGColor
    {
        get
        {
            if (IsInTheOtherList)
                return Color.FromRgb(0, 0,255);
            return Color.FromRgb(255, 255,0);

        }
    }
}

Xaml ListBox:

<ListBox x:Name="Source" 
         ItemsSource="{Binding CommandsSource , NotifyOnSourceUpdated=True}" 
         HorizontalAlignment="Left"           
         ScrollViewer.VerticalScrollBarVisibility="Visible"
         VerticalAlignment="Stretch" MinWidth="100">
  <ListBox.ItemTemplate>
     <DataTemplate>
        <DockPanel >
           <TextBlock Text="*"/>
           <Ellipse Fill="{Binding BGColor}" Width="10" Height="10"/>
           <TextBlock Text="{Binding CommandName}"/>
        </DockPanel>
     </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

问题是 ListBox 只显示 * 个字符

我已经通过更改 CommandItem class:

解决了这个问题
public class CommandItemClass : PropertyChangedBase
{
    private string _commandName;
    private bool _isInTheOtherList;
    public SolidColorBrush BGColor
    {
        get
        {
            if (IsInTheOtherList)
                return new SolidColorBrush(Color.FromRgb(0, 0, 255));
            return new SolidColorBrush(Color.FromRgb(255, 255, 0));
        }
    }

    public string CommandName
    {
        get
        {
            return _commandName;
        }
        set
        {
            _commandName = value;
            NotifyOfPropertyChange(()=>CommandName);
        }
    }

    public bool IsInTheOtherList
    {
        get
        {
            return _isInTheOtherList;
        }
        set
        {
            _isInTheOtherList = value;
            NotifyOfPropertyChange(() => IsInTheOtherList);
            NotifyOfPropertyChange(()=>BGColor);
        }
    }
}