Wpf 单击按钮时在列表框中添加项目失败
我是MVVM的新手。我有两个网格位于主窗口的内侧,其中一个网格包含左侧的列表框,另一个网格位于右侧,包含列表视图和两个按钮 我能够将项目添加到listview,甚至知道如何从列表视图中获取所选项目。在列表视图中选择项目并单击按钮(连接)后,左侧的列表框将使用我从viewmodel类中添加的项目进行更新 下面的视图显示了我左边的列表框:Wpf 单击按钮时在列表框中添加项目失败,wpf,listview,mvvm,listboxitem,Wpf,Listview,Mvvm,Listboxitem,我是MVVM的新手。我有两个网格位于主窗口的内侧,其中一个网格包含左侧的列表框,另一个网格位于右侧,包含列表视图和两个按钮 我能够将项目添加到listview,甚至知道如何从列表视图中获取所选项目。在列表视图中选择项目并单击按钮(连接)后,左侧的列表框将使用我从viewmodel类中添加的项目进行更新 下面的视图显示了我左边的列表框: <Grid Grid.Column="0" Name="BoardTabSelect" HorizontalAlignment="Stretch" Vert
<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>
<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>
下面的视图显示向右的listview以及两个按钮:
<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>
<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" });
}
}
}
公共类ProductViewModel:INotifyPropertyChanged
{
公开上市m_产品;
公共列表m_BoardTabs;
公共产品视图模型()
{
m_Products=新列表()
{
新产品(){Name=“Bavaria”,Connection_Status=“Disconnected”},
新产品(){Name=“Redhook”,Connection_Status=“Disconnected”},
};
m_BoardTabs=新列表()
{
新产品(){TabOperation=“Connect”}
};
}
公共列表产品{get;set;}
公共列表BoardTabs{get;set;}
私人产品m_SelectedItem;
公共产品精选产品
{
获取{return m_SelectedItem;}
设置
{
m_SelectedItem=值;
NotifyPropertyChanged(“SelectedProduct”);
}
}
私人产品m_SelectedTab;
公共产品选择选项卡
{
获取{return m_SelectedTab;}
设置
{
m_SelectedTab=数值;
NotifyPropertyChanged(“SelectedTab”);
}
}
私人ICommand mUpdater;
公共ICommand ConnectCommand
{
得到
{
if(mUpdater==null)
mUpdater=newdelegatecommand(新操作(SaveExecuted)、新函数(SaveCanExecute));
返回mUpdater;
}
设置{mUpdater=value;}
}
公共bool SaveCanExecute()
{
返回true;
}
public void SaveExecuted()
{
if(SelectedProduct.Connection_Status==“Disconnected”&&SelectedProduct.Name==“Bavaria”)
{
已选择Product.Connection\u Status=“已连接”;
添加(新产品(){TabOperation=“I2C”});
添加(新产品(){TabOperation=“Voltage”});
添加(新产品(){TabOperation=“Codec”});
}
}
}
在Save Executed方法中,我试图在listbox中添加项目,但当我运行应用程序并从listview中选择项目并按CONNECT Btn时,列表不会得到更新。我的模型类包含所有三个属性(名称、连接状态和选项卡操作)
BoardTabs
和产品
需要是一个可观察的集合
。否则,WPF不会得到列表中新项目的通知,因此无法更新UI。BoardTabs
和产品
需要是一个可观察的集合。否则,WPF不会得到列表中新项目的通知,因此无法更新UI。检查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")
}
}
公开列出产品
{
得到
{
退回m_产品;
}
设置
{
m_产品=价值;
NotifyPropertyChanged(“产品”)
}
}
公共列表板选项卡
{
得到
{
返回m_BoardTabs;
}
设置
{
m_BoardTabs=值;
NotifyPropertyChanged(“BoardTabs”)
}
}
检查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")
}
}
公开列出产品
{
得到
{
退回m_产品;
}
设置
{
m_产品=价值;
NotifyPropertyChanged(“产品”)
}
}
公共列表板选项卡
{
得到
{
返回m_BoardTabs;
}
设置
{
m_BoardTabs=值;
NotifyPropertyChanged(“BoardTabs”)
}
}
非常感谢,丹尼尔。上帝保佑你:)当项目被插入列表框时,我点击12C,在selectTab的帮助下,我希望右边的网格被I2C的UI所取代。请help@user1084880这似乎是一个新问题。请这样贴。非常感谢丹尼尔。上帝保佑你:)当项目被插入列表框时,我点击12C,在selectTab的帮助下,我希望右边的网格被I2C的UI所取代。请help@user1084880这似乎是一个新问题。请按此发布。Igor请在此帮助:Igor请在此帮助: