通过另一个用户控件中的按钮打开用户控件

时间:2014-03-12 14:59:56

标签: wpf user-controls

所以,我的设置是这样的:

  • 我的MainWindow有一个TabControl,有5个标签。为了保持我的文件中的代码干净,我决定将5个选项卡的内容分为5 UserControls
  • 简而言之,标签1包含UserControl客户(查看:CustomersView,ViewModel:CustomersViewModel),ComboBox。 ComboBox ItemSource绑定到由ObservableCollection(Of String)填充的DbServiceKlant.GetKlantenlijst
  • 同样在标签1中,我有一个按钮,可以将新客户添加到数据库中。这将打开另一个覆盖整个MainWindow的UserControl。
  • 此第二个UserControl(查看:AddCustomerView,ViewModel:AddCustomerViewModel)有一些要填写的表单,有一个Sub来帮助数据到数据库。

我首先在MainWindow中完成了这一切,但代码采用寿司比例(在.xaml和.xaml.vb中),它不再可维护。将所有内容都放在1个文件中,可以很容易地传递变量并将项添加到ObservableCollection中。

随着UserControls中所有内容的分离,对我来说一直是个问题,我将如何实现这一目标。基本上是:

  • UserControl Customers有一个ObservableCollection填充Customer和一个用于打开UserControl AddCustomer的按钮。
  • 在UserControl中,AddCustomer我有一个按钮,可以将填写的表单添加到数据库中。

现在的问题是:

  • 如何从客户打开UserControl AddCustomer?
  • 如果我关闭AddCustomer,如何在Customers中更新我的ObservableCollection?

当所有内容都在1个文件中时,我只是操纵了AddCustomer的Visibility并且可以更新ObservableCollection。

这是Customers的摘录。

<ComboBox Background="White" ItemsSource="{Binding Klantenlijst}" SelectedItem="{Binding SelectedKlant}" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="4" />
<Button Grid.Column="5" Command="{Binding OpenAddKlant}" ToolTip="Nieuwe klant">
    <Image Source="/Images/Add.png" />
</Button>

ObservableCollection。

Private _oKlantenlijst As ObservableCollection(Of String) = DbServiceKlant.GetKlantenlijst
Public Property Klantenlijst As ObservableCollection(Of String)
    Get
        Return _oKlantenlijst
    End Get
    Set(ByVal value As ObservableCollection(Of String))
        _oKlantenlijst = value
        OnPropertyChanged()
    End Set
End Property

ICommand:

Private _oOpenAddKlant As New RelayCommand(AddressOf OpenAddKlantSub)
Public ReadOnly Property OpenAddKlant As RelayCommand
    Get
        Return _oOpenAddKlant
    End Get
End Property

实际的Sub

Public Sub OpenAddKlantSub()
    ' I think here should be the code to open the AddCustomer UserControl
End Sub

在我的1文件应用程序(我正在转换为UserControls)中,AddCustomer弹出窗口中有Sub

Private Sub PopUpAddKlantAdd(sender As Object, e As RoutedEventArgs)
    Try
        If PupAddKlaNaa.Equals("") OrElse PupAddKlaStr.Equals("") OrElse PupAddKlaGem.Equals("") Then
            MessageBox.Show("U moet minstens de naam, straat en gemeente invullen om een nieuwe klant aan te kunnen maken.", "Geen gegevens", MessageBoxButton.OK, MessageBoxImage.Information)
        Else
            DbServiceKlant.Create(PupAddKlaNaa, PupAddKlaStr, PupAddKlaNr_, PupAddKlaBus, PupAddKlaPos, PupAddKlaGem, PupAddKlaLan, PupAddKlaTel, PupAddKlaBTW)
            _oKlant = DbServiceKlant.GetDetails(PupAddKlaNaa) 
            PopUpAddKlantClose()
            PopUpAddKlantClear()
            VoGetNaamKlanten()
            VoFillDetailsKlant(_oKlant)
            VoKlaSel = _oKlant.Naam
        End If
    Catch ex As Exception
        ExceptionLogger.Log(ex, 1)
    End Try
End Sub

0 个答案:

没有答案