Привязка объекта в Caliburn.Micro MVVM Framework с SelectedItem - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть следующие модели:

public class Profile
    {
        public string name { get; set; }
        public Member casemanager { get; set; }
        public Member assistant { get; set; }
    }

public class Member 
    {
        public int Id { get; set; }
        public int Type{ get; set; }
        public string Name { get; set; }
    }

В моей ViewModel у меня есть следующие объекты:

  • именованные профили ObservableCollection<Profile>, которые заполняются из базы данных;
  • a SelectedProfile типа Profile, конечно;
  • Два списка членов с именами ListCaseManagers и ListAssistants, которые заполняются из БД.

Каждый из объектов реализует NotifyOfPropertyChange метод из Caliburn.Micro и устанавливаются со свойством и вспомогательным полем.

Представление:

<StackPanel>
 <ListView ItemsSource="{Binding Profiles}" SelectedItem="{Binding SelectedProfile}" DisplayMemberPath="name" SelectionMode="Single" />
 <ComboBox ItemsSource="{Binding ListCaseManagers}" SelectedItem="{Binding SelectedProfile.casemanager }"  IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"/>
 <ComboBox ItemsSource="{Binding ListAssistants}" SelectedItem="{Binding  SelectedProfile.assistant}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"/>
</StackPanel>

В этом XAML я думал, что SelectedItem каждого ComboBox будет привязываться непосредственно к менеджеру / помощнику SelectedProfile, меняясь каждый раз, когда я изменяю SelectedProfile с помощью ListView, но кажется, что элемент в выпадающем списке не выделяется, хотя SelectedProfile.casemanager и SelectedProfile.assistant не равны NULL.

Чего мне не хватает? Есть ли простой способ использования соглашений с Caliburn.Micro?

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

, чтобы использовать условное имя Caliburn, вы должны дать имя своему элементу управления

, например, для ListView:

<StackPanel>
 <ListView x:Name ="Profiles"  />
</StackPanel>

с соглашением имен, Caliburn автоматически связывает Профили коллекции и использование SelectedProfiles в качестве SelectedItem

1 голос
/ 27 апреля 2020

Вам нужно либо повысить PropertyChanged для свойства SelectedProfile, когда оно установлено:

private Profile_selectedProfile;
public ProfileSelectedProfile
{
    get { return _selectedProfile; }
    set
    {
        _selectedProfile = value;
        NotifyOfPropertyChange(() => SelectedProfile);
    }
}

Или вы можете привязать к свойству SelectedItem самого элемента управления ListView:

<StackPanel>
    <ListView x:Name="lv" ItemsSource="{Binding Profiles}"
            SelectedItem="{Binding SelectedProfile}" 
            DisplayMemberPath="name" SelectionMode="Single" />
    <ComboBox ItemsSource="{Binding ListCaseManagers}"
            SelectedItem="{Binding SelectedItem.casemanager, ElementName=lv }"  
            DisplayMemberPath="Name"/>
    <ComboBox ItemsSource="{Binding ListAssistants}"
            SelectedItem="{Binding SelectedItem.assistant, ElementName=lv}" 
            DisplayMemberPath="Name"/>
</StackPanel>
1 голос
/ 26 апреля 2020

В выпадающем списке присутствует пара свойств, которые могут позволить вам изменить ваш SelectedItem в вашем списке.

SelectedValuePath="Id" <br/>
SelectedValue="{Binding SelectedProfile.casemanager.Id}"

Upd : этот подход позволяет связать выбранный элемент по некоторому уникальному атрибуту ( ID или имя)

В случае, если вам нужно работать с SelectedItem .., вы должны быть уверены, что реквизиты элементов в коллекции Profiles связаны с объектом в ListCaseManagers и ListAssistants

var query = from p in Profiles
            join mgr in ListCaseManagers on p.casemanager==mgr
            select p;
? query.Count
enter code here

Я предполагаю вы увидите 0 .. так как объекты в коллекции разные.

...