Невозможно добавить элементы в список при нажатии кнопки.

Я новичок в MVVM. У меня есть две сетки внутри главного окна, где одна сетка содержит список с левой стороны, а другая сетка с правой стороны содержит вид списка и 2 кнопки.

Я могу добавлять элементы в список и даже выяснять, как получить выбранный элемент из списка. Как только я выбираю элемент в виде списка и нажимаю кнопку (Подключить), список слева направо обновляется элементами, которые я добавил из класса viewmodel.

На приведенном ниже изображении слева от меня отображается Listbox:

<Grid Grid.Column="0" Name="BoardTabSelect" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <ListBox Name="ButtonPanel" 
             ItemsSource="{Binding BoardTabs, Mode=TwoWay}" 
             SelectedItem="{Binding SelectedTab, Mode=TwoWay}" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Name="BoardtabChanger" 
                               Margin="53,27,0,0" 
                               Text="{Binding TabOperation}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

Ниже показан вид списка справа и 2 кнопки:

<Grid Grid.Row="0" Name="MainConnectGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
    <ListView Name="listView" 
              ItemsSource="{Binding Products}" 
              SelectedItem="{Binding SelectedProduct, Mode=TwoWay}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="300" 
                                Header="Name" 
                                DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Width="283" 
                                Header="Connection Status" 
                                DisplayMemberBinding="{Binding Connection_Status}" />
            </GridView>
        </ListView.View>
    </ListView>

    <Button Content="Connect" 
            Height="23" Width="100" 
            HorizontalAlignment="Left" VerticalAlignment="Top"
            Margin="55,519,0,0" 
            Name="ConnectBtnGrid"  
            Command="{Binding Path=ConnectCommand}" />                        
    <Button Content="Disconnect" 
            Height="23" Width="100"
            HorizontalAlignment="Left" VerticalAlignment="Top" 
            Margin="446,519,0,0" 
            Name="DisconnectBtn" 
            Command="{Binding Path=DisconnectCommand}" />
</Grid>

ПРОСМОТРЕТЬ МОДЕЛЬ:

public class ProductViewModel : INotifyPropertyChanged 
{
    public List<Product> m_Products;
    public List<Product> m_BoardTabs;                

    public ProductViewModel()
    {           
        m_Products = new List<Product>()
        {                
            new Product() {Name = "Bavaria", Connection_Status = "Disconnected"},
            new Product() {Name = "Redhook", Connection_Status = "Disconnected"},                
        };

        m_BoardTabs = new List<Product>()
        {
            new Product() {TabOperation = "Connect"}                 
        };
    }                      

    public List<Product> Products { get; set; }

    public List<Product> BoardTabs { get; set; }

    private Product m_SelectedItem;
    public Product SelectedProduct
    {
        get { return m_SelectedItem; }

        set
        {
            m_SelectedItem = value;                
            NotifyPropertyChanged("SelectedProduct");
        }
    }

    private Product m_SelectedTab;
    public Product SelectedTab
    {
        get { return m_SelectedTab; }

        set
        {
            m_SelectedTab = value;
            NotifyPropertyChanged("SelectedTab");                
        }
    }

    private ICommand mUpdater;
    public ICommand ConnectCommand
    {
        get
        {
            if (mUpdater == null)
                mUpdater = new DelegateCommand(new Action(SaveExecuted), new Func<bool>(SaveCanExecute));

            return mUpdater;
        }
        set { mUpdater = value; }
    }

    public bool SaveCanExecute()
    {
        return true;
    }     

    public void SaveExecuted()
    {
        if (SelectedProduct.Connection_Status == "Disconnected" && SelectedProduct.Name == "Bavaria")
        {
            SelectedProduct.Connection_Status = "Connected";
            m_BoardTabs.Add(new Product() { TabOperation = "I2C" });         
            m_BoardTabs.Add(new Product() { TabOperation = "Voltage" });    
            m_BoardTabs.Add(new Product() { TabOperation = "Codec" });   
        }
    }
}

Внутри метода «Сохранить выполненное» я пытаюсь добавить элементы в список, но когда я запускаю приложение, выбираю элемент из списка и нажимаю CONNECT Btn, список не обновляется. Мой класс модели укомплектован всеми тремя свойствами (Name, Connection Status и TabOperation).


person Mike Portnoy    schedule 17.09.2012    source источник


Ответы (2)


BoardTabs и Products должны быть ObservableCollection<Product>. В противном случае WPF не получает информацию о новых элементах в списках и, следовательно, не может обновлять пользовательский интерфейс.

person Daniel Hilgarth    schedule 17.09.2012
comment
Большое спасибо, Даниэль. Будьте здоровы :) - person Mike Portnoy; 17.09.2012
comment
Когда элемент вставляется в ListBox, я нажимаю 12C и с помощью selectTab хочу, чтобы сетка справа была заменена пользовательским интерфейсом I2C. Пожалуйста помоги - person Mike Portnoy; 17.09.2012
comment
@ user1084880: Кажется, это новый вопрос. Пожалуйста, разместите как таковой. - person Daniel Hilgarth; 17.09.2012

Проверьте свойства ProductViewModel. Он реализует INotifyPropertyChanged, и в продуктах BoardTabs вы не уведомляете об изменении.

  public List<Product> Products
        {
            get
            {
                return m_Products;
            }

            set
            {
                m_Products = value;
NotifyPropertyChanged("Products")
            }
        }

        public List<Product> BoardTabs
        {
            get
            {
                return m_BoardTabs;
            }

            set
            {
                m_BoardTabs = value;
NotifyPropertyChanged("BoardTabs")
            }
        }
person ígor    schedule 17.09.2012
comment
Игорь, пожалуйста, помогите здесь: stackoverflow.com/questions/12457264/ - person Mike Portnoy; 17.09.2012