簡體   English   中英

將多個WPF用戶定義的組合框綁定到同一單個Observable集合

[英]Binding multiple WPF user defined combo boxes to same single Observable collection

在我的代碼中,我有一個可觀察的集合,里面有許多組合框。 現在,我必須使用MVVM(模型-視圖-視圖模型)為每個組合框添加列表,即沒有任何代碼

View.xaml中:

<Window....  xmlns:VM="clr-namespace:myproject.myViewModel"
  ...  >
<Window.DataContext><VM:myViewModel/>

</Window.DataContext>
 <ItemsControl ItemsSource="{Binding myCollection}" >
        <ItemsControl.ItemTemplate >


            <DataTemplate>
                <DockPanel>

                     <Grid >
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid Margin="0,20,0,0" >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>

                           <TextBlock Text="City"  Margin="20" VerticalAlignment="Center"/>
                            <ComboBox   KeyboardNavigation.TabIndex="0" Grid.Column="1" Margin="45,10,10,10" Height="30" Width="200" ItemsSource="{Binding City}"   />
                            <TextBlock Text="temperature" Grid.Row="1"  VerticalAlignment="Center" Margin="20" />

                            <ComboBox KeyboardNavigation.TabIndex="3" Grid.Column="1" Grid.Row="1" Margin="45,20,10,10" Height="30" Width="200" SelectedIndex="0"   HorizontalContentAlignment="Right" 
                          VerticalAlignment="Center"  ItemsSource="{Binding Temperature}">
                                                                </ComboBox>
                            <TextBlock Text="State" Grid.Row="1"  VerticalAlignment="Center" Margin="10" Grid.Column="2"/>
                            <ComboBox  KeyboardNavigation.TabIndex="3" Grid.Column="3" Grid.Row="1" Margin="10" Height="30" Width="200"    HorizontalContentAlignment="Center" ItemsSource="{Binding State}" >

                            </ComboBox>


      <TextBlock Text="Open Files "  VerticalAlignment="Center"      Grid.Row="0"  Grid.Column="2" Margin="10"    />
                                <TextBox  Grid.Column="3" Text="" Height="30" Grid.Row="0"   IsReadOnly="True" 
                        TextAlignment="Right" VerticalContentAlignment="Center" Width="200" />                                    <Button  Grid.Column="4"  Content="Browse"    Height="30" VerticalAlignment="Bottom"   MinWidth="41" />


                            </Grid>

     </Window>  

In **Model.cs**:

    namespace myproject.Models
    {

public class projectmodel : INotifyPropertyChanged
    {
        private ObservableCollection<projectmodel> city;
        private  ObservableCollection<projectmodel> temperature;
        private  ObservableCollection<projectmodel> state;

    public  ObservableCollection<projectmodel> City
    {
        get { return city; }
        set
        {
            city = value;
            NotifyPropertyChanged("City");
        }
    }
     public  ObservableCollection<projectmodel> Temperature
    {
        get { return temperature; }
        set
        {
            temperature = value;
            NotifyPropertyChanged("Temperature");
        }
    }
    public  ObservableCollection<projectmodel> State
    {
        get { return state; }
        set
        {
            state = value;
            NotifyPropertyChanged("State");
        }
    }
#region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region Private Helpers

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

    #endregion
}}

ViewModel.cs中

namespace myproject.ViewModels
{
    public class projectViewModel
    {
         public ObservableCollection<T> myCollection
        {
            get; set;
        }
        public projectViewModel()
        {


        myCollection = new ObservableCollection<T>();
       List<string> lstCity = new List<string>();
       lstCity = new List<string> { "Coimbatore", "Chennai", "Bangalore" };
       List<string> lstTemperature = new List<string>();
       lstTemperature = new List<string> { "17c", "18c", "15c" };
        List<string> lstState = new List<string>();
       lstState = new List<string> { "Andhra", "karnataka", "TamilNadu" };
}
}myCollection.Add(new projectmodel
            {
                City = lstCity.ToArray(),
                Temperature = lstTemperature.ToArray(),
                State= lstState.ToArray()
            });
        }
}}

這是我的代碼,如果選擇組合框,我什么也沒得到。 請建議我該如何寫我的viewmodel.cs,如果我在其他地方寫錯了,也請糾正我。

您必須將projectmodel所有集合聲明為ObservableCollection<string>類型,而不是sting[] 每當綁定到集合時,請使用ObservableCollection<T>

您的視圖模型還必須全部實現INotifyPropertyChanged

變化:

ProjectModel:

namespace Myproject.Models
{
  public class ProjectModel : INotifyPropertyChanged
  {
    private ObservableCollection<string> city;
    private ObservableCollection<string> temperature;
    private ObservableCollection<string> state;

    public ObservableCollection<string> City
    {
      get { return city; }
      set
      {
        city = value;
        NotifyPropertyChanged("City");
      }
    }

    public ObservableCollection<string> Temperature
    {
      get { return temperature; }
      set
      {
        temperature = value;
        NotifyPropertyChanged("Temperature");
      }
    }

    public ObservableCollection<string> State
    {
      get { return state; }
      set
      {
        state = value;
        NotifyPropertyChanged("State");
      }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region Private Helpers

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

    #endregion
  }
}

ProjectViewModel:

namespace MyProject.ViewModels    
{
  public class ProjectViewModel : INotifyPropertyChanged
  {
    private ObservableCollection<Projectmodel> myCollection;

    public ObservableCollection<Projectmodel> MyCollection
    {
      get => this.myCollection;
      set
      {
        if (Equals(value, this.myCollection)) return;
        this.myCollection = value;
        OnPropertyChanged();
      }
    }

    public ProjectViewModel()
    {
      MyCollection = new ObservableCollection<Projectmodel>()
      {
        new ProjectModel()
        {
           City = new ObservableCollection<string>()
              {
                 "Coimbatore", "Chennai", "Bangalore"
              },
           Temperature = new ObservableCollection<string>()
              {
                 "17c", "18c", "15c"
              },
           State = new ObservableCollection<string>()
              {
                 "Andhra", "karnataka", "TamilNadu"
              }
        }
      };
    }

    public event PropertyChangedEventHandler PropertyChanged;   

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
      this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
  }
}

編輯:我更新了代碼,以使用PascalCase滿足常見的命名約定。 建議遵循它們: C#約定

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM