0

私はWPFが初めてで、MVVMの概念を学び始めています。

DB からのデータを保持するグラフィック オブジェクトを作成するアプリケーションに取り組んでいます。

複数のラベルとコンボボックスを含むグループ ボックスがあります。

それぞれが私のDBから来るリストを保持する必要があります。

最初のコンボボックスでは、その特定のリストに MVVVM を使用してそれを埋めることができました。

しかし、最初のリストで DataContext を既に開始している場合、他のコンボボックスを埋めるにはどうすればよいでしょうか?

ComboBox ごとに ModelView を作成する必要がありますか?

そして一般的に、いくつかのコンボボックスをリストに動的にバインドするにはどうすればよいですか?

<Label Grid.Row="0"
       Grid.Column="0"
       Grid.ColumnSpan="2"
       Name="lblTiNam">Test Item Name :</Label>
<TextBox Grid.Row="0"
         Grid.Column="2"
         Name="tbTiName"
         MinWidth="100"
         MaxWidth="100"></TextBox>
<Label Grid.Row="1"
       Grid.Column="0"
       Grid.ColumnSpan="2"
       Name="lblTiExStat">Execution Status :</Label>
<ComboBox Grid.Row="1"
          Grid.Column="2"
          x:Name="cbTiExStat"
          MinWidth="100"
          MaxWidth="100"
          SelectedValuePath="Content"
          ItemsSource="{Binding Binding QcLists.FieldList}"
          DisplayMemberPath="Name">

</ComboBox>
<Label Grid.Row="2"
       Grid.Column="0"
       Grid.ColumnSpan="2"
       Name="lblTiVersion">Version :</Label>
<ComboBox Grid.Row="2"
          Grid.Column="2"
          Name="cbTiVersion"
          MinWidth="100"
          MaxWidth="100"
          SelectedValuePath="Content"
          SelectedIndex="1">
  <ComboBoxItem>To BE Bind From QC</ComboBoxItem>
</ComboBox>
<Label Grid.Row="3"
       Grid.Column="0"
       Grid.ColumnSpan="2"
       Name="lblTiCRID">CRID :</Label>
<ComboBox Grid.Row="3"
          Grid.Column="2"
          Name="cbTiCRID"
          MinWidth="100"
          MaxWidth="100"
          SelectedValuePath="Content">
  <ComboBoxItem>To BE Bind From QC</ComboBoxItem>
</ComboBox>
<Label Grid.Row="4"
       Grid.Column="0"
       Grid.ColumnSpan="2"
       Name="lblTiApplication">Application :</Label>
<ComboBox Grid.Row="4"
          Grid.Column="2"
          Name="cbTiApplication"
          MinWidth="100"
          MaxWidth="100"
          SelectedValuePath="Content">
  <ComboBoxItem>To BE Bind From QC</ComboBoxItem>
</ComboBox>
<Label Grid.Row="5"
       Grid.Column="0"
       Grid.ColumnSpan="2"
       Name="lblTiTestLevel">Test Level :</Label>
<ComboBox Grid.Row="5"
          Grid.Column="2"
          Name="cbTiTestLevel"
          MinWidth="100"
          MaxWidth="100"
          SelectedValuePath="Content">
  <ComboBoxItem>To BE Bind From QC</ComboBoxItem>
</ComboBox>

詳細情報を追加するために私の質問を編集しています:

内部クラス TestableItemViewModel { public QCLists QcLists { get { return _qcLists; } }

    #endregion

   #region Constructor
    public TestableItemViewModel()
    {
        _qcconnect = QCConnection.QCConnect.getInstance();
       // LoadListSettings();
        LoadListSettings( "TS_USER_05");
        SaveCommand = new TestableItemSaveDetailsCommand(this);
    }
    #endregion

    private void LoadListSettings(String FieldName)
    {
        Customization cust = QCConnection.QCConnect.getInstance().GetTD.Customization;
        CustomizationFields fields = cust.Fields;
        CustomizationListNode node;
        CustomizationField field;
        field = fields.get_Field("TEST", FieldName);
        node = field.List.RootNode;
        _qcLists = new QCLists(node.Children, node.Name);
    }

}

class QCLists:INotifyPropertyChanged
{
    TDAPIOLELib.List _fieldList;
    List<String> myTestList;
    String listName;

    public String ListName
    {
        get { return listName; }
        set { listName = value; }
    }

    public List<String> MyTestList
    {
        get { return myTestList; }
        set { myTestList = value; }
    }

    public QCLists(TDAPIOLELib.List List,String name)
    {
        _fieldList = List;
        myTestList = new List<String>();
        listName = name;
    }

    public TDAPIOLELib.List FieldList
    {
        get
        {
            return _fieldList;
        }

        set
        {
            _fieldList = value;
            OnPropertyChanged("FieldList");

        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }

    }

}

上記の xaml の背後にあるコードの場合:

 DataContext = new TestableItemViewModel();

それらは私が使用した私のクラスです。私のxamlでわかるように、最初のcombocoxはrequierdリストにバインドされており、期待どおりの値を見ることができます。他のコンボボックスをバインドし続けるにはどうすればよいですか? 最初のリストに既にバインドされている TestableItemViewModel のインスタンスが 1 つしかなく、データ コンテキストがそのリストを使用しているためです。他のコントロールにバインドする必要がある他のリスト(実際には4つ)があります。もちろん、必要なリストを取得するためにクエリを使用していますが、リスト名はいつでも変更できるため、これは別の問題です。今のところ、5 バインディングの問題を解決するだけです。

4

4 に答える 4

2

MVVM パラダイムでコンボ ボックスをバインドするには - ViewModel クラスにリストを追加し、コンボ ボックスに表示する項目を入力する必要があります。例を挙げて説明しましょう:

ViewModel (インターフェイス INotifyPropertyChanged を実装する必要があります):

public BindingList<string> Cities { get; set; } 

コンボ ボックスの値がデータベースから読み込まれていると言うので、値の読み込みが完了したら、"Cities" で PropertyChanged を発生させる必要があります。このようにして、ビューはプロパティにバインドされたものを更新することを認識します。都市」。

ビューで:

<Combobox ItemsSource="{Binding Cities}" />
于 2013-10-28T14:45:04.500 に答える
0

これを実現する 1 つの方法は、データベース レコードのモデルとレコードのリストのモデルがある場合です。

便宜上、年の例を使用します。

class YearModel : INotifyPropertyChanged
{
    #region Members

    myService.Year _year;

    #endregion

    #region Properties

    public myService.Year Year
    {
        get { return _year; }
    }

    public Int32 id
    {
        get { return Year.id; }
        set
        {
            Year.id = value;
            NotifyPropertyChanged("id");
        }
    }

    public String Code
    {
        get { return Year.Code; }
        set
        {
            Year.Code = value;
            NotifyPropertyChanged("Code");
        }
    }

#region Construction

    public YearModel()
    {
        this._year = new SchoolMonitor_Service.Year
        {
            id = 0,
            Code = "",
        };
    }

    #endregion
}

次に、リスト

class YearListModel
{
    myService.myServcieClient service = new myService.myServcieClient();

    #region Members

    private ObservableCollection<YearModel> _years;

    #endregion

    #region Properties

    public ObservableCollection<YearModel> Years
    {
        get { return _years; }
    }

    #endregion

    #region Construction

    public YearListModel()
    {
        _years = new ObservableCollection<YearModel>();

        foreach (SchoolMonitor_Service.Year y in service.GetYearList())
        {
            _years.Add(new YearModel
            {
                id = y.id,
                Code = y.Code
            }
                            );
        }
    }

    #endregion
}

次に、必要なすべてのリストを取得する ViewModel を作成します。例として YearGroups を追加しました。

class YearFormViewModel
{
    public YearListModel YearList { get; set; }
    public YearGroupListModel YearGroupList { get; set; }

    public YearFormViewModel()
    {
        YearList = new YearListModel;
        YearGroupList = new YearGroupListModel();
    }
}

その後、ウィンドウ/ページで ViewModel を取得できます。

xmlns:local="clr-namespace:myProject.Models"


<Page.Resources>
    <local:YearFormViewModel x:Key="myViewModel" />
</Page.Resources>

次に、それに応じてバインドします。

<ComboBox x:Name="cbYears" 
                      DataContext="{StaticResource ResourceKey=myViewModel}"
                      ItemsSource="{Binding Path=YearList.Years}"
                      SelectedValuePath="id" 
                      DisplayMemberPath="Code"/>
<ComboBox x:Name="cbYearGroups" 
                      DataContext="{StaticResource ResourceKey=myViewModel}"
                      ItemsSource="{Binding Path=YearGroupList.YearGroups}"
                      SelectedValuePath="id" 
                      DisplayMemberPath="Code"/>
于 2013-10-28T14:58:33.337 に答える
0

私があなたを正しく理解していれば、コンボボックスを文字列に動的に追加したいと考えています。

CS :

public class CollectionWrapper<T>  
{
    private string _title;
    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }

    private IList<T> _collection;

    public IList<T> Collection
    {
        get { return _collection; }
        set { _collection = value; }
    }     

    public string DisplayMemeberPath
    {
       get;set;
    } 


}


public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public List<string> GetNewList()
    {
        return new List<string>
        {
           "1","2","3","4","1","2","3","4","1","2","3","4","1","2","3","4"
        };
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Items.Add(new CollectionWrapper<string> { Collection = GetNewList(), Title = (Items.Count + 1 ).ToString() , DisplayMemeberPath="Content"}); 
    }

    private ObservableCollection<CollectionWrapper<string>> _items;
    public ObservableCollection<CollectionWrapper<string>> Items
    {
        get
        {
            if (_items == null)
                _items = new ObservableCollection<CollectionWrapper<string>>();
            return _items;
        }
    }
}

XAML :

 <Window.Resources>
    <DataTemplate  x:Key="listItemTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <Label Content="{Binding Title}"/>
            <ComboBox Grid.Column="1" ItemsSource="{Binding Collection}" DisplayMemberPath="{Binding DisplayMemeberPath}"/>

        </Grid>            
    </DataTemplate>

</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
    </Grid.RowDefinitions>


    <Button Content="Add List" Click="Button_Click"/>

    <ScrollViewer Grid.Row="1">
        <ItemsControl ItemTemplate="{StaticResource listItemTemplate}" ItemsSource="{Binding Items}"/>
    </ScrollViewer>
</Grid>
于 2013-10-28T14:54:31.687 に答える