WPFアプリケーションがあります。
左側にはボタンでいっぱいのスタックパネルがあります。
右側には空のドックパネルがあります。
ユーザーがボタンをクリックすると、対応するUserControl(ビュー)がドックパネルにロードされます。
private void btnGeneralClick(object sender, System.Windows.RoutedEventArgs e)
{
PanelMainContent.Children.Clear();
Button button = (Button)e.OriginalSource;
Type type = this.GetType();
Assembly assembly = type.Assembly;
IBaseView userControl = UserControls[button.Tag.ToString()] as IBaseView;
userControl.SetDataContext();
PanelMainContent.Children.Add(userControl as UserControl);
}
このパターンは、各UserControlがモデルから取得した情報をフィードするViewModelクラスを持つビューであるため、うまく機能します。したがって、ユーザーはページからページへクリックでき、各ページはすべての顧客の編集などの分離された機能を実行できます。データベースへの保存など。
問題:
ただし、これらのページの1つに、顧客のリストを含むリストボックスが必要であり、各顧客には「編集」ボタンがあり、その編集ボタンをクリックすると、DockPanelにEditSingleCustomerを入力します。 UserControlを使用して、編集する必要のある顧客を渡します。
EditCustomerユーザーコントロールをロードできますが、編集する顧客を渡し、その顧客を編集するためにDataContextを設定するにはどうすればよいですか?
- すべてのUserControlが既に作成されており、MainWindow.xaml.csのディクショナリに存在するため、コンストラクターに渡すことができません。
- そのため、各UserControlにPrepareUserControlメソッドを作成し、Customerをそのメソッドに渡し、x:Name = "..."を使用してコードビハインドからテキストボックスで表示できますが、それは重要ではありません。ItemsControlをにDataBindする必要があります。もちろん、WPFのデータバインディング機能を利用するためのObservableCollection。
- そのため、ビュー内のListBoxItemSourceを次のようにコードビハインドにバインドしようとしました。
<UserControl.Resources>
<local:ManageSingleCustomer x:Key="CustomersDataProvider"/>
</UserControl.Resources>
<DockPanel>
<ListBox ItemsSource="{Binding Path=CurrentCustomersBeingEdited, Source={StaticResource CustomersDataProvider}}"
ItemTemplate="{DynamicResource allCustomersDataTemplate}"
Style="{DynamicResource allCustomersListBox}">
</ListBox>
</DockPanel>
そのビューのIntializeComponent()の無限ループが原因でスタックオーバーフローエラーが発生します。したがって、これについては間違った方法で行っていると思います。WPFで1つのUserControlから別のUserControlにコマンドを渡すだけの簡単なパラダイムが必要です(誰かが「WPFコマンドを使用する」と言う前に、私はすでにコマンドを使用していますUserControlで、ユーザーがすべての顧客を編集できるようにします。これは正常に機能しますが、親ウィンドウコンテキストで別のユーザーを読み込むことができるようにする必要があるため、ビューの背後にあるコードで(ビューモデルではなく)処理する必要があります。保存が終了したときの制御:
<Button Style="{StaticResource formButton}"
Content="Save"
Command="local:Commands.SaveCustomer"
CommandParameter="{Binding}"/>
private void OnSave(object sender, System.Windows.Input.ExecutedRoutedEventArgs e)
{
Customer customer = e.Parameter as Customer;
Customer.Save(customer);
MainWindow parentShell = Window.GetWindow(this) as MainWindow;
Button btnCustomers = parentShell.FindName("btnCustomers") as Button;
btnCustomers.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
}
では、WPFで、UserControlをDockPanelにロードし、そのUserControl内に、別のUserControlをロードし、そのUserControlにコントロールをバインドできる特定のオブジェクトを送信するコマンドを含むボタンを設定するにはどうすればよいでしょうか。
この時点では、WPFコマンドについて十分に理解していないと想像できます。誰かがここから正しい方向に私を向けることができれば、それは素晴らしいことです。または、この「DockPanelパターンでのUserControlsの読み込みはWPFとは無関係であり、回避し、アプリケーションを構造化する別の方法に置き換える必要があります」と、これも役立つニュースです。アプリケーションの現在の状態をここからダウンロードして、アプリケーションがどのように構成されているかを知ることができます。ありがとう。