WPF Listview ModelView仅更新一次
我想从ModelView更新ListView,它只工作一次(在程序启动时),这是错误的。 方法BatterieApiMqtt_MessageReceived每两秒调用一次,值正在更改 谢谢 这是我的密码 模型 模型 公共级能源监测器 { [JsonProperty(“值”)] 公共IList accuValues{get;set;} } 模型视图WPF Listview ModelView仅更新一次,wpf,data-binding,Wpf,Data Binding,我想从ModelView更新ListView,它只工作一次(在程序启动时),这是错误的。 方法BatterieApiMqtt_MessageReceived每两秒调用一次,值正在更改 谢谢 这是我的密码 模型 模型 公共级能源监测器 { [JsonProperty(“值”)] 公共IList accuValues{get;set;} } 模型视图 public class AccuViewModel { private IList<AccuModel> _AccuModel
public class AccuViewModel
{
private IList<AccuModel> _AccuModelsList;
private Api.BatterieApi BatterieApiMqtt;
public AccuViewModel()
{
this.BatterieApiMqtt = new Api.BatterieApi();
BatterieApiMqtt.MessageReceived += BatterieApiMqtt_MessageReceived;
}
private void BatterieApiMqtt_MessageReceived(object sender, EventArgs e)
{
var values = BatterieApiMqtt.EnergieMonitorValues().accuValues;
_AccuModelsList = new List<AccuModel>();
if (_AccuModelsList.Count > 0)
{
_AccuModelsList.Clear();
}
for (int i = 0; i < values.Count; i++)
{
_AccuModelsList.Add(new AccuModel());
_AccuModelsList[i] = values[i];
}
}
public IList<AccuModel> AccuModel
{
get { return _AccuModelsList; }
set { _AccuModelsList = value; }
}
}
Control.xaml
<Grid Margin="10,90,1170,320">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ListView Name="ListAccus" Grid.Row="1" Margin="10,10,0,10" ItemsSource="{Binding AccuModel}" FontSize="18" FontFamily="Arial" Foreground="WhiteSmoke" Background="Transparent" AlternationCount="2" ItemContainerStyle="{StaticResource alternateColor}">
<ListView.View>
<GridView>
<GridView.ColumnHeaderContainerStyle>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Background" Value="#FF5B8577"/>
<Setter Property="Height" Value="30"/>
</Style>
</GridView.ColumnHeaderContainerStyle>
<GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="50"/>
<GridViewColumn Header="Spannung [V]" DisplayMemberBinding="{Binding Voltage, Mode=TwoWay}" Width="120" />
<GridViewColumn Header="Strom [A]" DisplayMemberBinding="{Binding Current, Mode=TwoWay}" Width="120" />
<GridViewColumn Header="Leistung [W]" DisplayMemberBinding="{Binding Power, Mode=TwoWay}" Width="120" />
<GridViewColumn Header="Ladezustand [%]" DisplayMemberBinding="{Binding Ladezustand, Mode=TwoWay}" Width="150" />
<GridViewColumn Header="Restkapazität [Ah]" DisplayMemberBinding="{Binding Ladezustand, Mode=TwoWay}" Width="150" />
</GridView>
</ListView.View>
</ListView>
</Grid>
您可以考虑不清除列表,只需分配新的值(可能会获得性能…)< /P>尝试使用<代码> StababCeleLoope<代码>,而不是<代码>列表< /代码>。另外,在添加另一项之前,不要清除列表,只需添加即可。您的意思是在AccuViewModel.cs中?同样的事情只在更新备份字段(\u AccuModelsList)而不是属性(AccuModelsList)时更新,propertychanged事件不会触发,UI不会更新。别忘了将Inotifypropertychanged添加到Viewmodel中!您可以绑定不触发任何事件的Viewmodel
public ucWBatterie12VUebersicht()
{
InitializeComponent();
AccuViewModel viewModel = new AccuViewModel();
ListAccus.DataContext = viewModel;
}
<Grid Margin="10,90,1170,320">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ListView Name="ListAccus" Grid.Row="1" Margin="10,10,0,10" ItemsSource="{Binding AccuModel}" FontSize="18" FontFamily="Arial" Foreground="WhiteSmoke" Background="Transparent" AlternationCount="2" ItemContainerStyle="{StaticResource alternateColor}">
<ListView.View>
<GridView>
<GridView.ColumnHeaderContainerStyle>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Background" Value="#FF5B8577"/>
<Setter Property="Height" Value="30"/>
</Style>
</GridView.ColumnHeaderContainerStyle>
<GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="50"/>
<GridViewColumn Header="Spannung [V]" DisplayMemberBinding="{Binding Voltage, Mode=TwoWay}" Width="120" />
<GridViewColumn Header="Strom [A]" DisplayMemberBinding="{Binding Current, Mode=TwoWay}" Width="120" />
<GridViewColumn Header="Leistung [W]" DisplayMemberBinding="{Binding Power, Mode=TwoWay}" Width="120" />
<GridViewColumn Header="Ladezustand [%]" DisplayMemberBinding="{Binding Ladezustand, Mode=TwoWay}" Width="150" />
<GridViewColumn Header="Restkapazität [Ah]" DisplayMemberBinding="{Binding Ladezustand, Mode=TwoWay}" Width="150" />
</GridView>
</ListView.View>
</ListView>
</Grid>