0

MVVM パターンを使用して WPF アプリケーションを作成しています。TabControl を使用して UI を作成しました。1 つのタブには社内のクライアントのリストがあり、もう 1 つのタブには新しいクライアントを追加するためのフォームがあります。私は2つのことをしたい:

  1. 新しいクライアントの追加 --> クライアントのタブが押されたときのリスト上の新しい位置
  2. クライアントを追加した後にフォーム TextBoxes をクリアする

どちらも機能しません。

私のDataGrid部分:

<StackPanel DataContext="{StaticResource ClientsVM}">
    <Image HorizontalAlignment="Left" VerticalAlignment="Top" Source="pack://application:,,,/Insurance company;component/Resources/logo.png" Height="100" Margin="5,15,0,0"/>
    <DataGrid  Name="ClientsGrid" ItemsSource="{Binding Clients, Mode=TwoWay}" IsReadOnly="True" Margin="130,0" AutoGenerateColumns="False" ColumnWidth="101">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Client ID" Binding="{Binding ClientId}"/>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Surname" Binding="{Binding Surname}"/>
            <DataGridTextColumn Header="PESEL" Binding="{Binding PESEL}" />
        </DataGrid.Columns>
        <DataGrid.InputBindings>
            <MouseBinding Gesture="LeftDoubleClick" Command="{Binding ClientsGridLeftDoubleClickCommand}" CommandParameter="{Binding ElementName=ClientsGrid, Path=SelectedItem}" />
        </DataGrid.InputBindings>
    </DataGrid>
</StackPanel>

私のViewModelの一部:

private ObservableCollection<ClientSet> _clients;

public ObservableCollection<ClientSet> Clients
{
    get { return _clients; }
    set
    {
        if (_clients != value)
        {
            _clients = value;
            RaisePropertyChanged(() => "Clients");
        }
    }
}

残念ながら、次のようなことをしています:

_clients = new ObservableCollection<ClientSet>(updatedListOfClientsHere);

動作しません。なぜだめですか?

もう1つは、フォームをクリアすることです。次のようになります。

<Label Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="100" FontSize="15">Surname</Label>
<TextBox Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="141" Name="Surname" Text="{Binding Client.Surname, Mode=TwoWay, ValidatesOnDataErrors=True}"/>
<Label Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="100" FontSize="15">Name</Label>
<TextBox Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="141" Name="Name" Text="{Binding Client.Name, Mode=TwoWay, ValidatesOnDataErrors=True}" />

また、ユーザーが入力した値は ViewModel クラスに適切に反映されます。しかし、ViewModel でそれらをクリアすると、UI では何も起こりません。ここに私のViewModelの一部:

private ClientSet _client;

public ClientSet Client
{
    get { return _client; }
    set
    {
        if (value != _client)
        {
            _client = value;
            RaisePropertyChanged(() => "Client");
        };
    }
}

// Some code

// Clearing the form:
_client = new ClientSet(); // This shouldn't work?
Client.Name = string.empty; // This should work!!!

私は今、本当にアイデアがありません。

4

2 に答える 2

0

あなたの質問からいくつかの問題に気づきました。まず、ビュー モデル内の任意のプロパティのプライベート メンバーの呼び出しは、UI を更新したくない場合にのみ行う必要があります。UI を更新する場合は、パブリック プロパティINotifyPropertyChanged使用する必要があります。これは、 (メソッドを介して) インターフェイスに通知するためRaisePropertyChangedです。したがって、クライアント リストをクリアするには、次のように呼び出します。

Clients = new ObservableCollection<ClientSet>(updatedListOfClientsHere);

次に、クラスを表示していないため、よくわかりませんが、インターフェイスをClientSet実装していないと思います。INotifyPropertyChangedただし、そのクラスのプロパティの変更が更新されることをまだ期待しています...そのクラスに実装するか、ビューモデルで各プロパティをラップRaisePropertyChangedしてそこからメソッドを呼び出さない限り、更新されません。次に、呼び出すClient.Name = string.empty;とそのフィールドがクリアされます。

于 2013-11-06T09:25:07.350 に答える