ComboBox selectedItem影响另一个ComboBox

时间:2013-04-25 10:35:42

标签: data-binding windows-store-apps

我有一个关于数据绑定的问题,我真的很难理解。我的扩展启动画面上有两个ComboBox。我想要实现的是当您从第一个ComboBox中选择一个项目时,第二个ComboBox中的项目应该更改。请参阅下面的代码。

首先让我试着解释一下我的数据是什么样子以及我面临的问题。

  • 收藏
      • AA
      • AB
      • AC
      • BA
      • BB
    • Ç
      • CA

第一个ComboBox应该显示A,B和C作为项目。现在假设您选择了A,ComboBox 2应该显示AA,AB和AC作为项目。我遇到的问题是ComboBox 2只显示AA而不是全部3项。

我的ViewModel调用MainViewModel如下所示: -

    public class ItemViewModel : INotifyPropertyChanged
{

    private string _befattning;
    public string Befattning
    {
        get
        {
            return _befattning;
        }
        set
        {
            if (value != _befattning)
            {
                _befattning = value;
                NotifyPropertyChanged("Befattning");
            }
        }
    }

    private string _befattning2;
    public string Befattning2
    {
        get
        {
            return _befattning2;
        }
        set
        {
            if (value != _befattning2)
            {
                _befattning2 = value;
                NotifyPropertyChanged("Befattning2");
            }
        }
    }

    private string _befattning3;
    public string Befattning3
    {
        get
        {
            return _befattning3;
        }
        set
        {
            if (value != _befattning3)
            {
                _befattning3 = value;
                NotifyPropertyChanged("Befattning3");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        //NotifyPropertyChanged Code
    }
}



public class MainViewModelGroups : INotifyPropertyChanged
{
    public MainViewModelGroups(String enhet)
    {
        this._enhetsNamn = enhet;
    }

    private string _enhetsNamn;
    public string EnhetsNamn
    {
        get { return _enhetsNamn; }
    }

    private string _selectedItem;
    public string SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            if (value != _selectedItem)
            {
                _selectedItem = value;
                NotifyPropertyChanged("SelectedItem");
            }
        }
    }

    private ObservableCollection<ItemViewModel> _items = new ObservableCollection<ItemViewModel>();
    public ObservableCollection<ItemViewModel> Items
    {
        get
        {
            return this._items;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        //NotifyPropertyChangedCode
    }
}

public sealed class MainViewModel
{
    private static MainViewModel _mainViewModel = new MainViewModel();

    private ObservableCollection<MainViewModelGroups> _collection = new ObservableCollection<MainViewModelGroups>();
    public ObservableCollection<MainViewModelGroups> Collection
    {
        get { return this._collection; }
    }

    public MainViewModel()
    {
        var enhet1 = new MainViewModelGroups("Akutmottagning");
        enhet1.Items.Add(new ItemViewModel() { Befattning = "Ledningsansvarig sjuksköterska" });
        Collection.Add(enhet1);
    }

我的XAML代码看起来像这样

<ComboBox x:Name="EnhetLista" 
              ItemsSource="{Binding Collection}"
              SelectedItem="{Binding SelectedItem, Mode=OneWay}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding EnhetsNamn}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    <ComboBox x:Name="BefattningsLista"
              DataContext="{Binding ElementName=EnhetLista, Path=SelectedItem, Mode=OneWay}"
              ItemsSource="{Binding Path=Items, Mode=OneWay}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

有人可以通过解释我的代码有什么问题以及如何实现我的目标来帮助吗?

1 个答案:

答案 0 :(得分:1)

向viewmodel添加第二个ObservableCollection,然后根据所选项目进行更改。

public sealed class MainViewModel
{
    private static MainViewModel _mainViewModel = new MainViewModel();

    private ObservableCollection<MainViewModelGroups> _collection = new ObservableCollection<MainViewModelGroups>();
    public ObservableCollection<MainViewModelGroups> Collection
    {
        get { return this._collection; }
    }

    public ObservableCollection<ItemViewModel> Items
    {
        get { return this._items; }
        set { this._items = value; OnPropertyChanged("Items"); }
    }

    public MainViewModelGroups SelectedGroup
    {
        get { return this._selectedGroup; }
        set { this._selectedGroup = value; Items = value.Items; }
    }

    public MainViewModel()
    {
        var enhet1 = new MainViewModelGroups("Akutmottagning");
        enhet1.Items.Add(new ItemViewModel() { Befattning = "Ledningsansvarig sjuksköterska" });
        Collection.Add(enhet1);
    }
}

您的Xaml将更改为:

<ComboBox x:Name="EnhetLista" 
          ItemsSource="{Binding Collection}"
          SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding EnhetsNamn}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
<ComboBox x:Name="BefattningsLista"
          ItemsSource="{Binding Path=Items}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

您的viewmodel可能需要实现INotifyPropertyChanged。但它可能不会,因为ObservableCollection可能会为你处理。