MVVM ViewModel에서 클래스의 인스턴스에 ListBox SelectedItem을 넣는 방법

파밍 카스 세 바다

내 ListBox의 SelectedItem에 문제가 있습니다. 내 HealthDiseaseViewModel의 Highlighted 속성에 선택한 항목을 넣고 싶습니다. 여기 내 ViewModel이 있습니다.

public class HealthDiseaseViewModel : ObservableCollection<HealthDisease>
{
    private string _feedBack;

    HealthDiseaseDb _db = new HealthDiseaseDb();

    public HealthDiseaseRetrieveSingleCommand RetrieveSingleCommand { get; set; }
    public HealthDiseaseRetrieveManyCommand RetrieveManyCommand { get; set; }   
    public HealthDiseaseUpdateCommand UpdateCommand { get; set; }   

    public HealthDisease Entity { get; set; }
    public HealthDisease Highlighted { get; set; }
    public List<HealthDisease> EntityList { get; set; }

    public HealthDiseaseViewModel()
    {
        RetrieveSingleCommand = new HealthDiseaseRetrieveSingleCommand(this);
        RetrieveManyCommand = new HealthDiseaseRetrieveManyCommand(this);       
        UpdateCommand = new HealthDiseaseUpdateCommand(this);       
        Highlighted = new HealthDisease();

        Entity = new HealthDisease();
        RetrieveMany(Entity);
    }

    #region Methods

    public void Retrieve(HealthDisease parameters)
    {
        Highlighted = _db.Retrieve(parameters);            
    }

    public void RetrieveMany(HealthDisease parameters)
    {
        EntityList = new List<HealthDisease>();

        EntityList = _db.RetrieveMany(parameters);      

        IList<HealthDisease> toBeRemoved = Items.ToList();

        foreach (var item in toBeRemoved)
        {
            Remove(item);
        }

        foreach (var item in EntityList)
        {
            Add(item);
        }           
    }

    public void Insert(HealthDisease entity)
    {
        bool doesExist = false;
        if (_db.Insert(entity, SessionHelper.CurrentUser.Id, ref doesExist))
        {
            _feedBack = "Item Successfully Saved!";
            RetrieveMany(new HealthDisease());
        }
        else if (doesExist)
        {
            _feedBack = "Item Already Exists!";
        }
        else
        {
            _feedBack = "Not All Fields Were Filled-In!";
        }
        MessageBox.Show(_feedBack, "Item Insertion");
    }

    public void Update(HealthDisease entity)
    {
        bool doesExist = false;

        if (_db.Update(entity, SessionHelper.CurrentUser.Id, ref doesExist))
        {
            _feedBack = "Item Successfully Updated!";
            RetrieveMany(new HealthDisease());
        }
        else if (doesExist)
        {
            _feedBack = "Item Already Exists!";
        }
        else
        {
            _feedBack = "Not All Fields Were Filled-In!";
        }
        MessageBox.Show(_feedBack, "Item Edition");
    }

    public void Delete(HealthDisease entity)
    {
        var answer = MessageBox.Show(String.Format("Are you sure you want to delete \n{0}?", entity.Name), 
        "Item Deletion", MessageBoxButtons.YesNo);

        if (answer == DialogResult.No)
        {
            return;
        }

        if (_db.Delete(entity, SessionHelper.CurrentUser.Id))
        {
            _feedBack = "Item Successfully Deleted!";
            RetrieveMany(new HealthDisease());
        }

        MessageBox.Show(_feedBack, "Item Deletion");
    }   
    #endregion   
}

내 ListBox의 SelectedItem을 Highlighted에 바인딩하고 Highlighted.Name 및 Highlighted.Description을 TextBlocks에 원했지만 TextBlocks에 SelectedItem이 표시되지 않습니다. SelectedItem.Name 및 SelectedItem.Description을 사용하여이 문제를 해결할 수 있지만 문제는 아직 저장 버튼을 누르지 않아도 자동으로 ListBox를 업데이트한다는 것입니다. 강조 표시된 개체를 사용하면이 문제가 해결되지만 지금은 몇 시간 동안 좌절감을 느끼고 있습니다. 여기 내 마크 업이 있습니다. 내 ViewModel에서 UpdateCommand에 바인딩 된 SaveButton을 생략했습니다.

<Grid Name="MainGrid" Background="Aqua" MinWidth="500" MinHeight="400" 
      DataContext="{Binding Source={StaticResource HealthViewModel}}">

    <StackPanel Orientation="Vertical">
        <TextBlock Text="{Binding Path=Highlighted.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBlock>
        <ListBox x:Name="EntityListBox" Margin="10,0" Height="380"
            ItemsSource="{Binding }"
            DisplayMemberPath="Name"
            SelectedItem="{Binding Path=Highlighted, Mode=TwoWay, 
                                   Converter={StaticResource ToHealthDiseaseConverter}, 
                                   UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>   
</Grid>
cscmh99

빠른 답변을 드릴 수 있지만 여기서 멈추지 않고 객체의 속성에 바인딩이 작동하지 않는 이유를 찾으려고 노력하지 않기를 바랍니다. DependencyProperty는 적절한 발생 PropertyChanged 트리거를 사용하여 INotifyPropertyChanged를 구현하는 인스턴스에 바인딩합니다. 인스턴스의 "값"에 바인딩되지 않습니다. Highlighted.Name 바인딩이 작동하지 않는 이유를 파악할 수 있는지 확인하십시오.

당신을 위해 간단한 샘플을 만들었습니다

<Window x:Class="WpfTestProj.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:WpfTestProj"
    mc:Ignorable="d" 
    d:DataContext="{d:DesignInstance Type=local:MainViewModel, IsDesignTimeCreatable=False}"
    Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
<Grid>
    <StackPanel Orientation="Vertical">
        <StackPanel>
            <TextBlock Text="{Binding Path=HighlightedName}" />
        </StackPanel>
        <StackPanel>
            <ListBox x:Name="EntityListBox" Margin="10,0"
                ItemsSource="{Binding EntityList}"
                DisplayMemberPath="Name"
                SelectedItem="{Binding Path=Highlighted, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </StackPanel>
     </StackPanel>
</Grid>

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class HealthDisease
{
    public string Name { get; set; }
}

public class MainViewModel : ViewModelBase
{
    public ObservableCollection<HealthDisease> EntityList { get; set; }

    public MainViewModel()
    {
        RetrieveMany();
    }

    private void RetrieveMany()
    {
        EntityList = new ObservableCollection<HealthDisease>
        {
            new HealthDisease {Name = "Disease A"},
            new HealthDisease {Name = "Disease B"},
            new HealthDisease {Name = "Disease C"}
        };
    }

    private HealthDisease highlighted;

    public HealthDisease Highlighted
    {
        get { return highlighted; }
        set
        {
            highlighted = value;
            OnPropertyChanged();
            OnPropertyChanged("HighlightedName");
        }
    }

    public string HighlightedName
    {
        get { return Highlighted == null ? string.Empty : Highlighted.Name; }
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

클래스의 한 인스턴스에만 액션을 적용하는 방법

분류에서Dev

Java에서 클래스 인스턴스 이름을 반환하는 방법

분류에서Dev

C # 2 개의 클래스에서 개체 / 인스턴스의 값을 참조 / 사용 / 설정하는 방법

분류에서Dev

인스턴스 변수에서 클래스의 인스턴스에 액세스하는 방법

분류에서Dev

인스턴스 변수에서 클래스의 인스턴스에 액세스하는 방법

분류에서Dev

SwiftUI에서 EnvironmentObject의 값을 클래스 인스턴스로 전달하는 방법은 무엇입니까?

분류에서Dev

EasyMock을 사용하여 테스트 클래스 내에서 인스턴스화되는 클래스를 모의하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 다른 인스턴스의 클래스 이름을 사용하여 인스턴스를 만드는 방법은 무엇입니까?

분류에서Dev

정의에서 클래스의 "공용"인스턴스를 얻는 방법

분류에서Dev

클래스의 각 인스턴스에 대해 다른 간격 값을 설정하는 방법

분류에서Dev

클래스의 다른 인스턴스간에 데이터 속성을 복사하는 가장 좋은 방법

분류에서Dev

변수가 목록 안에있을 때 클래스의 인스턴스 변수를 변경하는 방법

분류에서Dev

인스턴스 내에서 클래스의 인스턴스를 참조하는 방법

분류에서Dev

가져 와서 다른 클래스의 인스턴스를 만드는 곳에서 클래스 이름을 얻는 방법이 있습니까?

분류에서Dev

Swift의 ViewController에서 UIView 하위 클래스 인스턴스를 얻는 방법

분류에서Dev

AppDomain 아래에 클래스의 새 인스턴스를 만드는 방법

분류에서Dev

Python 클래스 내의 메서드 내에서 클래스의 인스턴스를 만드는 방법

분류에서Dev

파이썬의 단일 클래스에서 클래스의 여러 인스턴스를 상속하는 방법

분류에서Dev

다른 클래스 내에서 모의 클래스의 인스턴스를 만드는 방법

분류에서Dev

동일한 클래스 Perl에서 클래스의 인스턴스를 사용하는 방법

분류에서Dev

해당 클래스 내에서 클래스의 인스턴스를 전달하는 방법

분류에서Dev

외부 클래스 생성자에서 내부 클래스의 인스턴스를 만드는 방법

분류에서Dev

여러 테이블의 항목 클래스에 항목을 넣는 방법

분류에서Dev

클래스의 인스턴스를 파일에 저장하는 방법

분류에서Dev

클래스의 인스턴스를 파일에 저장하는 방법

분류에서Dev

IntelliJ의 클래스 인스턴스에서 스칼라 적용 함수의 사용법을 찾는 방법은 무엇입니까?

분류에서Dev

제네릭 클래스의 인스턴스 생성, 호출 클래스에 유형을 쉽게 설정하는 방법

분류에서Dev

일치 패턴 내에서 케이스 클래스의 일치 인스턴스를 가져 오는 방법

분류에서Dev

클래스에 속한 인스턴스 변수 중 하나에서 클래스의 특정 인스턴스를 가져 오는 방법

Related 관련 기사

  1. 1

    클래스의 한 인스턴스에만 액션을 적용하는 방법

  2. 2

    Java에서 클래스 인스턴스 이름을 반환하는 방법

  3. 3

    C # 2 개의 클래스에서 개체 / 인스턴스의 값을 참조 / 사용 / 설정하는 방법

  4. 4

    인스턴스 변수에서 클래스의 인스턴스에 액세스하는 방법

  5. 5

    인스턴스 변수에서 클래스의 인스턴스에 액세스하는 방법

  6. 6

    SwiftUI에서 EnvironmentObject의 값을 클래스 인스턴스로 전달하는 방법은 무엇입니까?

  7. 7

    EasyMock을 사용하여 테스트 클래스 내에서 인스턴스화되는 클래스를 모의하는 방법은 무엇입니까?

  8. 8

    파이썬에서 다른 인스턴스의 클래스 이름을 사용하여 인스턴스를 만드는 방법은 무엇입니까?

  9. 9

    정의에서 클래스의 "공용"인스턴스를 얻는 방법

  10. 10

    클래스의 각 인스턴스에 대해 다른 간격 값을 설정하는 방법

  11. 11

    클래스의 다른 인스턴스간에 데이터 속성을 복사하는 가장 좋은 방법

  12. 12

    변수가 목록 안에있을 때 클래스의 인스턴스 변수를 변경하는 방법

  13. 13

    인스턴스 내에서 클래스의 인스턴스를 참조하는 방법

  14. 14

    가져 와서 다른 클래스의 인스턴스를 만드는 곳에서 클래스 이름을 얻는 방법이 있습니까?

  15. 15

    Swift의 ViewController에서 UIView 하위 클래스 인스턴스를 얻는 방법

  16. 16

    AppDomain 아래에 클래스의 새 인스턴스를 만드는 방법

  17. 17

    Python 클래스 내의 메서드 내에서 클래스의 인스턴스를 만드는 방법

  18. 18

    파이썬의 단일 클래스에서 클래스의 여러 인스턴스를 상속하는 방법

  19. 19

    다른 클래스 내에서 모의 클래스의 인스턴스를 만드는 방법

  20. 20

    동일한 클래스 Perl에서 클래스의 인스턴스를 사용하는 방법

  21. 21

    해당 클래스 내에서 클래스의 인스턴스를 전달하는 방법

  22. 22

    외부 클래스 생성자에서 내부 클래스의 인스턴스를 만드는 방법

  23. 23

    여러 테이블의 항목 클래스에 항목을 넣는 방법

  24. 24

    클래스의 인스턴스를 파일에 저장하는 방법

  25. 25

    클래스의 인스턴스를 파일에 저장하는 방법

  26. 26

    IntelliJ의 클래스 인스턴스에서 스칼라 적용 함수의 사용법을 찾는 방법은 무엇입니까?

  27. 27

    제네릭 클래스의 인스턴스 생성, 호출 클래스에 유형을 쉽게 설정하는 방법

  28. 28

    일치 패턴 내에서 케이스 클래스의 일치 인스턴스를 가져 오는 방법

  29. 29

    클래스에 속한 인스턴스 변수 중 하나에서 클래스의 특정 인스턴스를 가져 오는 방법

뜨겁다태그

보관