0

我正在使用 MVVM 模式编写 WPF 应用程序。我使用 TabControl 创建了 UI。在一个选项卡中,我有一个公司客户列表,在另一个选项卡中,我有一个用于添加新客户的表单。我想要两件事:

  1. 添加新客户端 --> 按下带有客户端的选项卡时列表中的新位置
  2. 添加客户端后清除表单文本框

它们都不起作用。

我的数据网格部分:

<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>

我的视图模型的一部分:

private ObservableCollection<ClientSet> _clients;

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

不幸的是,做类似的事情:

_clients = new ObservableCollection<ClientSet>(updatedListOfClientsHere);

不起作用。为什么不?

另一件事是清除表格。它看起来像这样:

<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 更新,那么您必须使用公共属性,因为这是通知界面的内容(通过您的方法)。所以要清除客户列表,只需调用:INotifyPropertyChangedRaisePropertyChanged

Clients = new ObservableCollection<ClientSet>(updatedListOfClientsHere);

接下来,我不确定,因为您没有显示您的ClientSet课程,但我猜您没有INotifyPropertyChanged在其中实现接口。但是,您仍然希望更新该类的属性更改......除非您在该类中实现它,或者将每个属性包装在您的视图模型中并RaisePropertyChanged从那里调用您的方法,否则它们不会更新。然后,调用Client.Name = string.empty;将清除该字段。

于 2013-11-06T09:25:07.350 回答
0

我不完全确定你在问什么,但让我们看看:

首先,使用您的可观察集合,您无需再次设置它。如果您创建一个新客户端,您需要做的就是:

Clients.Add(new_client_object);

就这样。否则,如果创建客户端需要一段时间,您的程序会变慢(我已经看到这种情况发生,相信我......)

如果我理解正确,您想在添加新客户端后清除添加新客户端中的项目。你需要做的就是确保内容控件(希望你的添加客户端视图是一个用户控件或类似的东西)接收一个客户端类型的对象,并且在你添加它之后,只需将它设置为 null,或者放置一个新的 (空)对象,或手动将它们设置为空字符串(确保有一个备份,以防您想取消,或者您不覆盖新的客户字段)。

您可以添加一些屏幕截图来阐明您想要/需要的内容。

于 2013-11-06T01:00:27.233 回答