ListViewでTextBoxのテキストを変更しても、ObservableCollection <string>ソースは更新されません

メモリアルトーマス

私はListViewsの非常に複雑な構造を持っています。この構造の中には、ViewModelの値を持つTextBoxがあります。一部のテキストボックスの値を変更すると、ViewModelのプロパティが更新されません。ViewModelの「AllTexts」プロパティには、引き続き「Hello」文字列のみが含まれています。

基本的には、文字列のユーザー構造を表示してから、ユーザーにこの構造を変更させたいと思います。彼が変更を終えた後、私は彼の変更を保存したいと思います。「こんにちは」の文字列は、テストのためだけにここにあります。

私のViewModel:

class MainWindowViewModel
    {
        public ObservableCollection<ObservableCollection<ObservableCollection<string>>> AllTexts { get; set; }

        public int SelectedGroupIndex { get; set; }

        public int SelectedColumnIndex { get; set; }

        public ICommand AddGroup { get; private set; }

        public ICommand AddColumn { get; private set; }

        public MainWindowViewModel()
        {
            this.AllTexts = new ObservableCollection<ObservableCollection<ObservableCollection<string>>>();
            this.SelectedGroupIndex = -1;
            this.SelectedColumnIndex = -1;
            this.AddGroup = new Command(this.AddGroupCommandHandler);
            this.AddColumn = new Command(this.AddColumnCommandHandler);
        }

        private void AddGroupCommandHandler()
        {
            var tempColumn = new ObservableCollection<string>() { "Hello", "Hello", "Hello", "Hello", "Hello" };
            var tempGroup = new ObservableCollection<ObservableCollection<string>>();
            tempGroup.Add(tempColumn);
            this.AllTexts.Add(new ObservableCollection<ObservableCollection<string>>(tempGroup));
        }

        private void AddColumnCommandHandler()
        {
           if (this.SelectedGroupIndex >= 0 && this.SelectedGroupIndex < this.AllTexts.Count)
           {
                var tempColumn = new ObservableCollection<string>() { "Hello", "Hello", "Hello", "Hello", "Hello" };
                this.AllTexts[this.SelectedGroupIndex].Add(tempColumn);
           }
        }
    }

私の見解:

<Window.Resources>
        <ResourceDictionary>
            <local:MainWindowViewModel x:Key="vm" />
        </ResourceDictionary>
    </Window.Resources>

    <Grid Margin="10,10,10,10" VerticalAlignment="Top">
        <Grid.RowDefinitions>
            <RowDefinition Height="300" />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <ListView Grid.Row="0"
            ItemsSource="{Binding AllTexts, Source={StaticResource vm}, Mode=TwoWay}"
            Background="Red"
            SelectedIndex="{Binding SelectedGroupIndex, Source={StaticResource vm}}">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ListView
                        Background="Yellow"
                        ItemsSource="{Binding Path=., Mode=TwoWay}"
                        SelectedIndex="{Binding SelectedColumnIndex, Source={StaticResource vm}}">
                        <ListView.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal" />
                            </ItemsPanelTemplate>
                        </ListView.ItemsPanel>
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ListView
                                    Background="Green"
                                    ItemsSource="{Binding Path=., Mode=TwoWay}">
                                    <ListView.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel Orientation="Vertical" />
                                        </ItemsPanelTemplate>
                                    </ListView.ItemsPanel>
                                    <ListView.ItemTemplate>
                                        <DataTemplate>
                                            <TextBox Text="{Binding Path=., Mode=TwoWay, NotifyOnSourceUpdated=True}"
                                                     VerticalContentAlignment="Center"
                                                     HorizontalContentAlignment="Center"
                                                     Width="100" Height="40"/>
                                        </DataTemplate>
                                    </ListView.ItemTemplate>
                                </ListView>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>


        <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="0,20,0,0">
            <Button Content="Add Group" Width="120" Height="30"
                Command="{Binding AddGroup, Source={StaticResource vm}}" />
            <Button Content="Add Column" Margin="20,0,0,0" Width="120" Height="30"
                Command="{Binding AddColumn, Source={StaticResource vm}}" />
        </StackPanel>

        <StackPanel Grid.Row="2" Orientation="Horizontal" Margin="0,20,0,0">
            <TextBlock Width="120" Height="30" FontSize="20"
                Text="{Binding SelectedGroupIndex, Source={StaticResource vm}}" />
            <TextBlock Width="120" Height="30" Margin="20,0,0,0" FontSize="20"
                Text="{Binding SelectedColumnIndex, Source={StaticResource vm}}" />
        </StackPanel>
    </Grid>

誰か助けてくれませんか?ありがとうございました。

ビザン

ViewModelは、変更についてViewに通知する必要があります。そうしないと、ViewはViewModelの元の値を保持します。

この場合、string自分自身に加えられた変更を通知することはできません。含まれている監視可能なコレクションのみが、追加や削除など、それ自体に加えられた変更について通知でき、その要素をさらに監視することはありません。

したがって、観察可能な文字列が必要です。

public class MyString : DependencyObject
{
    public string Value
    {
        get { return (string)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(string), typeof(MyString), new PropertyMetadata(""));
}

コレクションで使用するには:

public ObservableCollection<ObservableCollection<ObservableCollection<MyString>>> AllTexts { get; set; }

またMyString、コードをテストするために次の行をクラスに追加しましたが、機能しました。

public static MyString Hello { get { return new MyString { Value = "Hello" }; } }

明らかに、これはそれがどのように使用されるかです:

 var tempColumn = new ObservableCollection<MyString>() { MyString.Hello, MyString.Hello, MyString.Hello, MyString.Hello, MyString.Hello };

xamlには、取り除くことができる不要なものもいくつかあります。

ItemsSource="{Binding}"両方に使用ListView、に使用Text="{Binding Value}"しますTextBoxTwoWayこれらのいずれにも明示的な必要はありません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Visual Studioでリソースの名前を変更しても、参照は更新されません

分類Dev

ViewModelのデータが変更されても、テキストボックスは更新されません

分類Dev

元のデータソースを変更してもComboBoxは更新されません

分類Dev

h1要素のテキストはjavascriptを使用して変更されていませんが、コンソールで変更されています

分類Dev

スクリプト内で.bashrcをソーシングしても、環境変数は更新されません

分類Dev

Androidでは、TextViewのテキストを動的に設定しても変更されません

分類Dev

WPFリソースフォントは更新されません

分類Dev

ObservableCollection <string>のアイテムは、WPFリストボックスにバインドされたときに更新されません

分類Dev

別のフォームからメソッドを呼び出しても、コントロールの色やテキストは変更されません

分類Dev

PrimeNG Datatableは、データソースが変更されても更新されません

分類Dev

ListViewのテキストの色を変更するC#スクリプトを追加しても、何も出力されません

分類Dev

リソースが変更されても静的バインディングは更新されません

分類Dev

SqlBulkCopyが例外をスローします:データソースからのString型の指定された値は、指定されたターゲット列のbigint型に変換できません

分類Dev

このエラーメッセージを回避する方法はありますか?「リソース@string / todoを解決できませんでしたヒント:レイアウトを更新してみてください。」

分類Dev

'string' / 'cin'はこのスコープで宣言されていません

分類Dev

JavascriptでTextboxのテキストを変更しても、Asp.NetでOnTextChangedがトリガーされないのはなぜですか

分類Dev

std :: stringは=演算子で更新されません

分類Dev

変数が変更されても、ボタンクリックでテキストの色を変更しても機能しません

分類Dev

文字列リストを文字列の長さの降順でソートしても、リストは変更されません

分類Dev

Gtk +3ラベルの色をその場で変更してもテキストの背景は変更されません

分類Dev

ListViewはアプリのテキストを変更しませんでした

分類Dev

フォームが投稿されてもLaravelルートリソースは更新されません

分類Dev

カスタムの子プロパティを変更しても、親クラスのコントロールは更新されません

分類Dev

TextBoxの.Textを ""またはString.Emptyに設定しても、GUIに表示されません。GUIの更新を強制する必要がありますか?

分類Dev

戦艦を作ろうとしていますが、String [] []ボードは正しく更新されません

分類Dev

WPFでスタイルを変更してもストーリーボードは変更されません

分類Dev

スピナーでは、特定のアイテムを選択しても背景は変更されません

分類Dev

どのテーマを使用しても、デフォルトのマウスカーソルは変更されません

分類Dev

Maven * .xmlリソースはビルド後に更新されません

Related 関連記事

  1. 1

    Visual Studioでリソースの名前を変更しても、参照は更新されません

  2. 2

    ViewModelのデータが変更されても、テキストボックスは更新されません

  3. 3

    元のデータソースを変更してもComboBoxは更新されません

  4. 4

    h1要素のテキストはjavascriptを使用して変更されていませんが、コンソールで変更されています

  5. 5

    スクリプト内で.bashrcをソーシングしても、環境変数は更新されません

  6. 6

    Androidでは、TextViewのテキストを動的に設定しても変更されません

  7. 7

    WPFリソースフォントは更新されません

  8. 8

    ObservableCollection <string>のアイテムは、WPFリストボックスにバインドされたときに更新されません

  9. 9

    別のフォームからメソッドを呼び出しても、コントロールの色やテキストは変更されません

  10. 10

    PrimeNG Datatableは、データソースが変更されても更新されません

  11. 11

    ListViewのテキストの色を変更するC#スクリプトを追加しても、何も出力されません

  12. 12

    リソースが変更されても静的バインディングは更新されません

  13. 13

    SqlBulkCopyが例外をスローします:データソースからのString型の指定された値は、指定されたターゲット列のbigint型に変換できません

  14. 14

    このエラーメッセージを回避する方法はありますか?「リソース@string / todoを解決できませんでしたヒント:レイアウトを更新してみてください。」

  15. 15

    'string' / 'cin'はこのスコープで宣言されていません

  16. 16

    JavascriptでTextboxのテキストを変更しても、Asp.NetでOnTextChangedがトリガーされないのはなぜですか

  17. 17

    std :: stringは=演算子で更新されません

  18. 18

    変数が変更されても、ボタンクリックでテキストの色を変更しても機能しません

  19. 19

    文字列リストを文字列の長さの降順でソートしても、リストは変更されません

  20. 20

    Gtk +3ラベルの色をその場で変更してもテキストの背景は変更されません

  21. 21

    ListViewはアプリのテキストを変更しませんでした

  22. 22

    フォームが投稿されてもLaravelルートリソースは更新されません

  23. 23

    カスタムの子プロパティを変更しても、親クラスのコントロールは更新されません

  24. 24

    TextBoxの.Textを ""またはString.Emptyに設定しても、GUIに表示されません。GUIの更新を強制する必要がありますか?

  25. 25

    戦艦を作ろうとしていますが、String [] []ボードは正しく更新されません

  26. 26

    WPFでスタイルを変更してもストーリーボードは変更されません

  27. 27

    スピナーでは、特定のアイテムを選択しても背景は変更されません

  28. 28

    どのテーマを使用しても、デフォルトのマウスカーソルは変更されません

  29. 29

    Maven * .xmlリソースはビルド後に更新されません

ホットタグ

アーカイブ