Caliburn.Micro не обновляет ListView после диктаторских изменений

Я использую Caliburn.Micro для создания рабочего стола MVVM, но у меня проблемы с обновлением ListView.

Это моя модель:

 public class Answer
    {
        public int AnswerType { get; set; }
        public string CorrectAnswer { get; set; }
    }

    public class TestCaseConfig
    {
        public float MaxReactionTime { get; set; }
        public List<Answer> Answers { get; set; }
    }

и я использую ObservableDictionary для уведомления о том, что коллекция была изменена ( http://blogs.microsoft.co.il/shimmy/2010/12/26/observabledictionarylttkey-tvaluegt-c/ )

public ObservableDictionary<string, TestCaseConfig> testCaseConfigs { get; set; }

но когда я обновляю (добавляю или удаляю элемент List<Answer> Answers), мой взгляд ничего не делает

Я выяснил, что эта проблема вызвана тем, что когда мы что-то меняем в коллекции, также меняет адрес в памяти для нее, но Caliburn не реагирует на эти изменения и продолжает показывать предыдущий список.

Это мой view.xaml:

<UserControl x:Class="Gillie.Barney.Views.ExaminationAnswerSetupView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:localization="clr-namespace:Gillie.Barney.Properties"
             xmlns:cal="http://www.caliburnproject.org"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">

    <UserControl.Resources>
        <ResourceDictionary>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment"
                            Value="Stretch" />
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="IsSelected" Value="True"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="39*"/>
            <RowDefinition Height="5*"/>
        </Grid.RowDefinitions>
        <ListView 
            Name="BaseListView"
            Margin="10" 
            Grid.Row="1" 
            ItemsSource="{Binding testCaseConfigs}"
            HorizontalContentAlignment="Center" Grid.ColumnSpan="2"
            SelectedItem ="{Binding TestCasesConfigSelectedItem, Mode=TwoWay}">
            <ListView.View>
                <GridView>
                    <GridViewColumn 
                        Header="{x:Static localization:Resources.TestCaseNameLable}" 
                        DisplayMemberBinding="{Binding Key}" />
                    <GridViewColumn Header="Reaction Time">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Value.MaxReactionTime}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Correct Answers">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <ListView 
                                        ItemsSource="{Binding Value.Answers, Mode=TwoWay}" 
                                        Grid.Column="0">
                                        <ListView.ItemTemplate>
                                            <DataTemplate>
                                                <Grid>
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="150"/>
                                                        <ColumnDefinition Width="150"/>
                                                        <ColumnDefinition Width="25"/>
                                                    </Grid.ColumnDefinitions>
                                                    <ComboBox 
                                                        Grid.Column="0" 
                                                        SelectedIndex="{Binding AnswerType}" 
                                                        Margin="5,0,5,0">
                                                        <ComboBoxItem Content="{x:Static localization:Resources.ScriptsLabel}"/>
                                                        <ComboBoxItem Content="{x:Static localization:Resources.AllObjectionsLabel}"/>
                                                        <ComboBoxItem Content="{x:Static localization:Resources.QuickAnswersLabel}"/>
                                                    </ComboBox>
                                                    <TextBox 
                                                        Grid.Column="1" 
                                                        Text="{Binding CorrectAnswer}"/>
                                                    <Button 
                                                        Grid.Column="2" 
                                                        HorizontalAlignment="Center"
                                                        Width="20" 
                                                        Height="20" 
                                                        Margin="5,0,0,0"
                                                        cal:Message.Attach="DeleteItem($dataContext)">
                                                        <Button.Content>
                                                            <Image Source="/Resources/delete.ico"/>
                                                        </Button.Content>
                                                    </Button>
                                                </Grid>
                                            </DataTemplate>
                                        </ListView.ItemTemplate>
                                    </ListView>
                                    <Button 
                                        VerticalAlignment="Bottom" 
                                        Width="20" Height="20" 
                                        Grid.Column="1" 
                                        Margin="5,0,0,2"
                                        cal:Message.Attach="AddItem()">
                                        <Button.Content>
                                            <Image Source="/Resources/add.ico"/>
                                        </Button.Content>
                                    </Button>
                                </Grid>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        <Button 
            Content="{x:Static localization:Resources.SettingsSaveButtonContent}" 
            Margin="10,0,10,10" 
            Grid.Row="2" 
            Grid.Column="1"
            cal:Message.Attach="Save()"/>
        <Button 
            Content="{x:Static localization:Resources.CancelButtonContent}" 
            Margin="10,0,10,10" 
            Grid.Row="2"  
            Grid.Column="0"
            cal:Message.Attach="Cancel()"/>
    </Grid>
</UserControl>

c#,.net,wpf,caliburn.micro,

1

Ответов: 1


0 принят

Прошло некоторое время с тех пор, как я использовал микрофон калиберн, так что сделайте следующее с зерном соли :)

ObservableDictionary<string, TestCaseConfig>

Только прослушивает изменения непосредственно в словаре, что означает, когда вы добавляете или удаляете элемент в словаре. В вашем случае вы этого не делаете, но, скорее, вы что-то меняете в элементе, уже находящемся в словаре.

Итак, вам нужно изменить

public List<Answer> Answers { get; set; }

к списку, на который можно наблюдать - например ObservableList<Anwer> (или аналогичное имя - не помню терминологию Caliburn.Micro).

C # ,. сеть, МОФ, caliburn.micro,
Похожие вопросы