2017-01-26 9 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"> 

IVEは、選択したとして最初のアイテムを使用するように言いました。これは私の最初の束縛が働くかどうかを調べるためのテストでした。私たちが知っている通り、それはそうではありません。

最終的には、選択されたアイテムは、少なくともデフォルトの選択されたアイテムとして使用することを選択したStoredActionsのboolプロパティによって決定されます。

この例のコンボボックスに何も入力されていない理由を誰かが教えてもらえますか?さらに、誰かが私が選択したアイテムのために私の選択されたプロパティを利用するのを助けることができる?これはデータテンプレートがどこに来るのでしょうか?

p.s.かなりwWPFとC#の新しいので、私はこれの6歳の説明が必要な場合があります。

答えて

2

StoredActionsは、Listです。 Textプロパティはありません。そうであれば、それはおそらく文字列になり、その文字列に文字のをコンボボックスに入力します。あなたが望むものではありません。

ItemsSourceStoredActionsを使用します。

私はあなたの意図が「StoredActionsのテキストプロパティを表示する」のようなものだと推測しています。各格納されたアクションのTextプロパティを表示する場合は、DisplayMemberPathプロパティを"Text"に設定します。コンボボックスは、保存された各アクションのTextプロパティを取得し、それを表示テキストに使用します。

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

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

これはまだ動作しない場合、我々はあなたがあなたのビューのDataContextを設定している方法を見てする必要があります。

ここで、選択項目について何かしたいのであれば、適切なMVVM形式でこれにアプローチする方法があります。

private StoredActionsModel _selectedStoredAction; 
    public StoredActionsModel SelectedStoredAction 
    { 
     get { return _selectedStoredAction; } 
     set 
     { 
      if (value != _selectedStoredAction) 
      { 
       _selectedStoredAction = value; OnPropertyChanged("SelectedStoredAction"); 
      } 
     } 
    } 
そしてそうのようなXAMLでそれに結合することを追加します:あなたのviewmodelにこのプロパティを追加

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

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

ユーザーがSelectedStoredActionに割り当てられますよう、コンボの項目を選択するとプロパティ。そのプロパティのセッターにコードを追加することもできますし、他のコントロールのプロパティをビューにバインドすることもできます。ので、多分同様

:あなたは、右再びです

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でどのように活用して、最初の選択がMy Defaultであるか、または選択されたものに基づいてそれぞれのプロパティを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

関連する問題