将 UserControl 加载到 ComboBox 更改上的窗口区域

发布于 2024-12-06 07:09:54 字数 338 浏览 0 评论 0原文

我有 ComboBox,其中填充了自定义类型的集合。在组合框更改时,我想加载/更改特定区域中的内容,以便加载所选组合框项的相关数据(它可以采用加载 userControl 的形式,或者我不介意为其指定 DataTemplate)。

它类似于这个问题WPF负载控制问题。但在这个问题中,他谈论的是实际列表框中的各个 DataTemplates,而我谈论的是在 ComboBox 更改上填充某些窗口区域。

我正在使用 MVVM(而不是 PRISM).Net 3.5。

I have got ComboBox which is populated with collection of customTypes. On comboBox change, I would like to load/change content in the particular region so that it loads related data for the selected ComboBox item (it could be in the form of loading userControl or I i dont mind specifying DataTemplate for it).

It is similar to this question WPF Load Control question. But in this question, he is talking about individual DataTemplates in the actual Listbox, while I am talking about populating certain window region on ComboBox change.

I am using MVVM (and not PRISM) .Net 3.5.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

撩动你心 2024-12-13 07:09:54

您可以使用ContentControl,它是根据组合框选择动态确定的实际Content 的占位符。

以下代码仅供参考

<Window ...>

   <Window.Resources>
       <MyView1 x:Key="MyView1" />
       <MyView2 x:Key="MyView2" />
   </Window.Resources>  

   ...

   <ComboBox x:Name="MyCombo">
       <ComboBox.ItemsSource>
           <sys:String>"MyView1"</sys:String>
           <sys:String>"MyView2"</sys:String>
           ....
       </ComboBox.ItemsSource>
   </ComboBox>

   ... 

   <!-- This is where your region is loaded -->
   <ContentControl>
       <ContentControl.Style>
           <Style TargetType="{x:Type ContentControl}">
               <Style.Triggers>
                   <DataTrigger Binding="{Binding Path=SelectedItem,
                                                  ElementName=MyCombo}"
                                Value="MyView1">
                        <Setter Property="Content"
                                Value="{StaticResource MyView1}"
                   </DataTrigger>
                   <DataTrigger Binding="{Binding Path=SelectedItem,
                                                  ElementName=MyCombo}"
                                Value="MyView2">
                        <Setter Property="Content"
                                Value="{StaticResource MyView2}"
                   </DataTrigger>
               </Style.Triggers>
           </Style>
       </ContentControl.Style>
   </ContentControl> 
</Window>

数据加载可以是 MyView1MyView2 用户控件的构造函数或主 UI 的数据上下文视图模型的一部分。

U could use ContentControl which is the placeholder for the actual Content that is dynamically decided as per combobox selection.

The follwoing code is just for guidance

<Window ...>

   <Window.Resources>
       <MyView1 x:Key="MyView1" />
       <MyView2 x:Key="MyView2" />
   </Window.Resources>  

   ...

   <ComboBox x:Name="MyCombo">
       <ComboBox.ItemsSource>
           <sys:String>"MyView1"</sys:String>
           <sys:String>"MyView2"</sys:String>
           ....
       </ComboBox.ItemsSource>
   </ComboBox>

   ... 

   <!-- This is where your region is loaded -->
   <ContentControl>
       <ContentControl.Style>
           <Style TargetType="{x:Type ContentControl}">
               <Style.Triggers>
                   <DataTrigger Binding="{Binding Path=SelectedItem,
                                                  ElementName=MyCombo}"
                                Value="MyView1">
                        <Setter Property="Content"
                                Value="{StaticResource MyView1}"
                   </DataTrigger>
                   <DataTrigger Binding="{Binding Path=SelectedItem,
                                                  ElementName=MyCombo}"
                                Value="MyView2">
                        <Setter Property="Content"
                                Value="{StaticResource MyView2}"
                   </DataTrigger>
               </Style.Triggers>
           </Style>
       </ContentControl.Style>
   </ContentControl> 
</Window>

The data loading can be part of the MyView1 and MyView2 user control's constructor or your main UI's data context view model.

め可乐爱微笑 2024-12-13 07:09:54

据我了解,问题是如何更改绑定到 UI 而不仅仅是 DataTemplate 的基础数据。

您可以使用 EventSetter ,它将在后面的代码中处理,您可以在其中切换您提到的区域的 DataContext:

<ComboBox>
     <ComboBox.Resources>         
         <Style TargetType="ComboBoxItem">             
           <EventSetter Event="Selector.SelectionChanged"
                        Handler="YourHandler"/>         
         </Style>     
     </ComboBox.Resources> 
</ComboBox>

但从 MVVM 的角度来看,这可能不是完美的解决方案,因此您可以引入自己的 ComboBox 类是否支持命令,请参阅此帖子:ComboBox 中的 WPF 命令支持

通过这种方式,您可以使用 Command 将逻辑与 UI 解耦。

As far as I understand the question is how to change underlying data being bound to UI and not a DataTemplate only.

You can use EventSetter which will be handled in code behind where you can switch DataContext for a region you've mentioned:

<ComboBox>
     <ComboBox.Resources>         
         <Style TargetType="ComboBoxItem">             
           <EventSetter Event="Selector.SelectionChanged"
                        Handler="YourHandler"/>         
         </Style>     
     </ComboBox.Resources> 
</ComboBox>

But from MVVM perspectives it could be not perfect solution so you can introduce your own ComboBox class wich is Command aware, see this SO post: WPF command support in ComboBox

In this way you can decouple logic from UI using Command.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文