Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF Listview ModelView仅更新一次_Wpf_Data Binding - Fatal编程技术网

WPF Listview ModelView仅更新一次

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

我想从ModelView更新ListView,它只工作一次(在程序启动时),这是错误的。 方法BatterieApiMqtt_MessageReceived每两秒调用一次,值正在更改

谢谢

这是我的密码

模型

模型 公共级能源监测器 { [JsonProperty(“值”)] 公共IList accuValues{get;set;} }

模型视图

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>

  • 在Viewmodel上实现InotifyPropertychanged接口
  • 用户ObservableCollection而不是IList(如slugster建议的那样)
  • 更新您的属性(AccumodelList),而不是备份字段(\u AccumodelList)
  • 这将解决您的问题


    您可以考虑不清除列表,只需分配新的值(可能会获得性能…)< /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>