Выберите первый элемент в выпадающем списке Silverlight, используя шаблон MVVM - PullRequest
2 голосов
/ 09 февраля 2011

Это мой первый набег в MVVM, и теперь я столкнулся со следующей проблемой:

У меня есть моя ViewModel:

  public List<WorkCellGroupInfo> WorkCellGroupInfoCollection
    {
        get
        {
            return _workCellGroupInfoCollection;
        }
        set
        {
            _workCellGroupInfoCollection = value;
            NotifyPropertyChanged( "WorkCellGroupInfoCollection" );

            SelectedWorkCellGroup = _workCellGroupInfoCollection.FirstOrDefault();
        }
    }

    public WorkCellGroupInfo SelectedWorkCellGroup
    {
        get
        {
            return _selectedWorkCellGroup;
        }
        set
        {
            _selectedWorkCellGroup = value;
            NotifyPropertyChanged( "SelectedWorkCellGroup" );
        }
    }

и мой XAML:

<ComboBox x:Name="WorkCellGroup" 
ItemsSource="{Binding WorkCellGroupInfoCollection}" 
SelectedItem="{Binding SelectedWorkCellGroup, Mode=TwoWay}" 
DisplayMemberPath="Name">

При первой загрузке поле со списком заполняется данными, но я не могу выбрать первый выбранный элемент.Что я делаю не так?

WorkCellGroupInfo является производным от класса FilterBase:

public abstract class FilterBase
{
    public string Id
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }
}

1 Ответ

2 голосов
/ 09 февраля 2011

Вам нужно присвоить значение свойству SelectedWorkCellGroup, чтобы сделать это.

В вашем конструкторе ViewModel напишите следующий код:

if(WorkCellGroupInfoCollection.Any()) 
{
    SelectedWorkCellGroup = WorkCellGroupInfoCollection.First();
}

Edit:

У меня следующие работы:

XAML:

<Grid x:Name="LayoutRoot"
      Background="White">
    <Border HorizontalAlignment="Center"
            VerticalAlignment="Center">
        <ComboBox x:Name="WorkCellGroup"
                  ItemsSource="{Binding WorkCellGroupInfoCollection}"
                  SelectedItem="{Binding SelectedWorkCellGroup, Mode=TwoWay}"
                  DisplayMemberPath="Name" />
    </Border>
</Grid>

Код позади:

public partial class ComboBoxSelectedItemTest : UserControl
{
    public ComboBoxSelectedItemTest()
    {
        InitializeComponent();

        DataContext = new ComboBoxSelectedItemTestViewModel();
    }
}

public abstract class FilterBase
{
    public string Id
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }
}

public class WorkCellGroupInfo : FilterBase
{ }

public class WorkCellGroupInfoCollection : ObservableCollection<WorkCellGroupInfo>
{ }

public class ComboBoxSelectedItemTestViewModel : INotifyPropertyChanged
{
    public WorkCellGroupInfoCollection WorkCellGroupInfoCollection { get; set; }

    public ComboBoxSelectedItemTestViewModel()
    {
        WorkCellGroupInfoCollection = new WorkCellGroupInfoCollection();

        for (int i = 0; i < 25; i++)
        {
            WorkCellGroupInfoCollection.Add(new WorkCellGroupInfo()
            {
                Id = String.Format("Id #{0}", i + 1),
                Name = String.Format("Name #{0}", i + 1)
            });
        }

        SelectedWorkCellGroup = WorkCellGroupInfoCollection.First();
    }

    private WorkCellGroupInfo _selectedWorkCellGroup;
    public WorkCellGroupInfo SelectedWorkCellGroup
    {
        get
        {
            return _selectedWorkCellGroup;
        }
        set
        {
            _selectedWorkCellGroup = value;
            RaisePropertyChanged("SelectedWorkCellGroup");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler temp = PropertyChanged;
        if (temp != null)
        {
            temp(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...