C# Caliburn Micro WPF中属性更改的刷新视图

C# Caliburn Micro WPF中属性更改的刷新视图,c#,wpf,caliburn.micro,C#,Wpf,Caliburn.micro,已获取具有BindingList属性的视图。它负责存储工作项、添加和删除。后端工作正常,但UI未更新 观点: <ListBox Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" x:Name="WorkPieces" HorizontalAlignment="Stretch"> <ListBox.ItemTemplate> <DataTemplate> <Gr

已获取具有BindingList属性的视图。它负责存储工作项、添加和删除。后端工作正常,但UI未更新

观点:

<ListBox Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" x:Name="WorkPieces" HorizontalAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                </Grid.ColumnDefinitions>

                <TextBlock Grid.Column="1" x:Name="DisplayName" Text="{Binding DisplayName}" MinWidth="40
                           " FontWeight="Bold"/>
                <TextBlock Grid.Column="2" Text="{x:Static lang:Resources.Txt_W}" />
                <TextBox Grid.Column="3" x:Name="Width" MinWidth="50" Text="{Binding Width}" TextAlignment="Right"/>
                <TextBlock Grid.Column="4" Text=" x " />
                <TextBlock Grid.Column="5" Text="{x:Static lang:Resources.Txt_L}" />
                <TextBox Grid.Column="6" x:Name="Length" MinWidth="50"  Text="{Binding Length}" TextAlignment="Right"/>

                <Button Grid.Row="0" Grid.Column="7" Margin="5" BorderThickness="0" Background="Transparent"
                        Visibility="{Binding IsLast, Converter={StaticResource Converter}}">
                    <Image Source ="/Images/plus-sign.png" Height="16" Width="16" />
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <cal:ActionMessage MethodName="AddNewWorkPiece" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>

                <Button Grid.Row="0" Grid.Column="8" Margin="5" BorderThickness="0" Background="Transparent">
                    <Image Source ="/Images/minus-sign.png" Height="16" Width="16" />
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <cal:ActionMessage MethodName="RemoveWorkPiece">
                                <cal:Parameter Value="{Binding Id}" />
                            </cal:ActionMessage>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
因此,当我单击Add/Remove时,它会正确地更新元素的数量,但其余部分不会刷新按钮或DisplayNumber。 尝试在添加和删除工件后调用NotifyOfPropertyChange,但没有任何预期结果

我们的目标是只在最后一个元素上显示一个+-图标,其余元素显示一个图标,显示的数字总是递增的,不管哪个元素被删除了

正如您所看到的:IV.缺失,III.具有不应该具有的+图标

由于您要绑定到IsLast,您应该在WorkPieceModel类中实现INotifyPropertyChanged接口,并在IsLast的setter中引发PropertyChanged事件。

是否在列表框中获得另一项?您是否提升最后一个项目的IsLast属性?@mm8是的,如果我获得了一个新项目,我可以删除任何项目。正如我写的那样,后端正在为每个项目设置正确的标志:后端工作正常,但UI没有更新。我不明白我该做什么。如果我得到一个新项目,我可以删除任何项目,这意味着。列表框中是否有新项目?后端似乎与您的问题无关。如果我单击+图标,它将添加一个新项目。新项目(因为它是最后一个)应该有+和-图标,其余的应该只有-图标。如果单击-图标,元素将从列表中删除,但图标不会更新。希望这能澄清问题非常感谢,这就是问题所在。
public BindingList<WorkPieceModel> WorkPieces
{
    get { return _workPieces; }
    set
    {
        _workPieces = value; NotifyOfPropertyChange(() => WorkPieces);
        NotifyOfPropertyChange(() => CanCalculate);
    }
}
private void UpdateWorkPiecesDisplayName()
{
    var counter = 1;
    foreach (var item in WorkPieces)
    {
        item.DisplayName = Roman.To(counter);
        item.IsLast = false;
        counter++;
    }

    WorkPieces.Last().IsLast = true;
    NotifyOfPropertyChange(() => WorkPieces);
}