使用WPF / MVVM在运行时动态更改UserControl内容

时间:2013-10-02 10:33:54

标签: c# wpf user-controls

我尝试创建的屏幕是一个多部分结果查看器。批处理作业完成后,您可以双击它并打开此屏幕,其中包含有关刚刚运行的批处理作业(屏幕的前30%,全宽)的基本数据的顶部,然后是较低的70%将由左对齐列表框(宽度的20%)和一系列子结果组成,细节窗格占据剩余的80%宽度。

我希望它表现的方式是当您在左侧列表框中选择“子结果”时,右侧窗格将填充子结果的详细信息。因为它很复杂并且需要可扩展,所以我想将每个子结果细节显示面板实现为UserControl。

父ViewModel包含IDictionary<Enum.ResultType, IResultPanel> - 并且将从此词典的键中填充列表框,当您选择一个选项时,它将从字典中获取IResultPanel对象,该对象将是User Control,一个

下面的示例摘录
public partial class SimpleCalcInfoResult : UserControl, IResultPanel
    {
        private SimpleCalcInfoResultViewModel _viewModel;

        public SimpleCalcInfoResult(SimpleCalcInfoResultViewModel viewModel)
        {
            InitializeComponent();
            _viewModel = viewModel;
        }
    }

IResultPanel接口是一个空白的空接口,仅用于使上面的Dictionary具有通用类型,因为我觉得UserControls字典过于宽泛。

我遇到的问题是我无法弄清楚在父控件中使用哪个XAML来拥有一个可更改的UserControl面板。显然你可以拥有

<local:MyControl> ... </local:MyControl>

作为硬编码的用户控件,但是如何使用XAML的一部分来更改显示的用户控件,具体取决于您选择的ListBox项目?

1 个答案:

答案 0 :(得分:12)

使用WPF很容易实现。但是,在使用MVVM时,我们“操纵”数据而不是UI控件。考虑到这一点,首先为DataTemplate部分中的每个自定义Panel控件声明Application.Resources

<DataTemplate DataType="{x:Type ViewModels:SimpleCalcInfoResultViewModel}">
    <Views:SimpleCalcInfoResult />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
    <Views:MainView />
</DataTemplate>

现在,您只需使用ContentControl在右下方显示相关视图模型:

<ContentControl Content="{Binding ViewModel}" />

最后,将名为IResultPanel的{​​{1}}类型的属性添加到父视图模型中:

ViewModel

现在,要在应用程序中显示不同的private IResultPanel viewModel = new FirstViewModel(); public IResultPanel ViewModel { get { return viewModel; } set { if (viewModel != value) { viewModel = value; NotifyPropertyChanged("ViewModel"); } } } ,只需将此属性设置为其他值:

Panel
相关问题