2017-01-26 3 views
0

나는 전혀 바인딩되지 않는 콤보 상자가 있습니다. 응용 프로그램이 실행될 때 아무 것도 채워지지 않습니다. 데이터는 linq에서 sql 클래스로 전달되어 객체의 사용자 정의 목록으로 이동합니다. 이 목록이 채워지는 적절한 시간에 확인할 수 있으므로 바인딩과 관련된 문제 여야합니다. 나는 데이터 템플릿이 갈 수있는 방법일지도 모른다고 의심하지만, 사실이 상황에 어떻게 적용 할 지 모르겠다.WPF 콤보 상자가 바인딩되지 않음

사용자 정의 개체 (모델)

namespace IhsDataSync.Models.Config 
{ 
    public class StoredActionsModel : BaseModel 
    { 
     private int _storedActionID; 

     public int StoredActionID 
     { 
      get { return _storedActionID; } 
      set { _storedActionID = value; OnPropertyChanged("StoredActionID"); } 
     } 

     private string _name; 

     public string Name 
     { 
      get { return _name; } 
      set { _name = value; OnPropertyChanged("Name"); } 
     } 

     private string _text; 

     public string Text 
     { 
      get { return _text; } 
      set { _text = value; OnPropertyChanged("Text"); } 
     } 

     private bool _selected; 

     public bool Selected 
     { 
      get { return _selected; } 
      set { _selected = value; OnPropertyChanged("Selected"); } 
     } 



    } 
} 

보기 모델

public static List<StoredActionsModel> StoredActionsList = ActionLinq.buildStoredActions(); // Grabs list from data access layer 

private List<StoredActionsModel> _storedActions = StoredActionsList; 

    public List<StoredActionsModel> StoredActions 
    { 

     get { return _storedActions; } 
     set { 
      if (value != _storedActions) 
      { 
       _storedActions = value; OnPropertyChanged("StoredActions"); } 
      } 

    } 

buildStoredActions()

public List<StoredActionsModel> buildStoredActions() 
{ 
    List<StoredActionsModel> storedActions = new List<StoredActionsModel>(); 

    var sa = getStoredActions(); 

    foreach (var a in sa) 
    { 
     bool selected = false; 
     if(a.Name == "Default Label"){ 
      selected = true; 
     } 

     storedActions.Add(new StoredActionsModel { StoredActionID = a.StoredActionID, Name = a.Name, Text = a.Text, Selected = selected }); 
    } 

    return storedActions; 
} 

XAML 여기

<ComboBox DockPanel.Dock="Top" Background="White" FontWeight="Bold" ItemsSource="{Binding Path= StoredActions.Text}" SelectedIndex="0"> 

필자는 선택으로 첫 번째 항목을 사용하도록했다. 이것은 초기 바인딩이 작동하는지 테스트하기위한 것입니다. 우리가 아는 바로는 그렇지 않습니다.

궁극적으로 선택한 항목이 StoredActions의 bool 속성에 의해 결정되는데, selected라는 것은 적어도 기본 선택된 항목으로 사용하고 싶습니다.

누군가이 콤보 상자에 아무 것도 채워지지 않는 이유를 말할 수 있습니까? 또한 누군가가 내가 선택한 항목에 대해 내가 선택한 속성을 활용하도록 도울 수 있습니까? 데이터 템플릿이 들어오는 곳입니까?

p.s. 상당히 wWPF와 C#에 익숙하지 않으므로이 6 년 된 설명이 필요할 수도 있습니다.

답변

2

StoredActionsList입니다. Text 속성이 없습니다. 그랬다면 아마 문자열 일 것이고 그 문자열에 문자 인으로 콤보 박스를 채울 것입니다. 네가 원하는게 아니야.

ItemsSourceStoredActions을 사용하고 싶습니다.

의도는 "StoredActions의 텍스트 속성 표시"와 같았습니다. 각 저장된 작업의 Text 속성을 표시하려면 DisplayMemberPath 속성을 "Text"으로 설정하십시오. 그런 다음 콤보 상자는 각 저장된 동작의 Text 속성을 사용하고 표시 텍스트로 사용합니다.

<ComboBox 
    DisplayMemberPath="Text" 
    ItemsSource="{Binding StoredActions}" 

    DockPanel.Dock="Top" 
    Background="White" 
    FontWeight="Bold" 
    SelectedIndex="0"> 

이 여전히 작동하지 않으면, 우리는 당신이보기의 DataContext을 설정하는 방법에 대해 살펴해야합니다.

이제 선택 항목에 대해 아무 것도하지 않으려는 경우 적절한 MVVM 방식으로 접근하는 방법을 설명합니다.그래서 같은 XAML에

private StoredActionsModel _selectedStoredAction; 
    public StoredActionsModel SelectedStoredAction 
    { 
     get { return _selectedStoredAction; } 
     set 
     { 
      if (value != _selectedStoredAction) 
      { 
       _selectedStoredAction = value; OnPropertyChanged("SelectedStoredAction"); 
      } 
     } 
    } 

을 그리고에 바인딩을 추가합니다 : 당신의 ViewModel이 속성을 추가

<ComboBox 
    DisplayMemberPath="Text" 
    ItemsSource="{Binding StoredActions}" 
    SelectedItem="{Binding SelectedStoredAction}" 

    DockPanel.Dock="Top" 
    Background="White" 
    FontWeight="Bold" 
    SelectedIndex="0"> 

을 사용자가 SelectedStoredAction에 할당됩니다 콤보에서 항목을 선택하면 재산. 해당 속성의 setter에 코드를 추가하거나 다른 컨트롤 속성을 뷰에 바인딩 할 수 있습니다. 그래서 아마처럼

: 당신이 바로 다시 한 번

private StoredActionsModel _selectedStoredAction; 
public StoredActionsModel SelectedStoredAction 
{ 
    get { return _selectedStoredAction; } 
    set 
    { 
     if (value != _selectedStoredAction) 
     { 
      // Unset Selected on old value, if there was one 
      if (_selectedStoredAction != null) 
      { 
       _selectedStoredAction.Selected = false; 
      } 
      _selectedStoredAction = value; 
      // Set Selected on new value, if there is one 
      if (_selectedStoredAction != null) 
      { 
       _selectedStoredAction.Selected = true; 
      } 
      OnPropertyChanged("SelectedStoredAction"); 
     } 
    } 
} 
+0

! 내가 선택한 속성을 StoredActions에서 어떻게 활용하여 초기 선택이 내 기본값이되거나 선택한 속성을 기준으로 해당 속성을 각각 true 또는 false로 변경할 수 있습니까? xaml 요소처럼 IsSelected = "Selected" – LCaraway

+1

@LCaraway 업데이트를 참조하십시오, 나는 그것을 커버한다고 생각합니다. –

+0

다른 하나가 있습니다. http://stackoverflow.com/questions/41877466/wpf-change-window-layout-based-on-combo-box-selection-using-mvvm – LCaraway

관련 문제