如何使用MVVM数据绑定WPF更新多个用户控件实例?

如何使用MVVM数据绑定WPF更新多个用户控件实例?,wpf,mvvm,wpf-controls,Wpf,Mvvm,Wpf Controls,我创建了一个带有ProgressBar和标签的UserControl <Label Content="{Binding ElementName=UserControl, Path=StatusProperty}" Grid.Row="1" Height="28" HorizontalAlignment="Left" Margin="76,0,0,32" Name="lblStatus" VerticalAlignment="Bottom" Grid.RowSpan="2" /> &l

我创建了一个带有
ProgressBar
标签的
UserControl

<Label Content="{Binding ElementName=UserControl, Path=StatusProperty}" Grid.Row="1" Height="28" HorizontalAlignment="Left" Margin="76,0,0,32" Name="lblStatus" VerticalAlignment="Bottom" Grid.RowSpan="2" />
<ProgressBar Grid.Row="2" Height="20" HorizontalAlignment="Left" Margin="12,3,0,0" Name="pbCheckProgress" Style="{DynamicResource ProgressBarStyle}" Maximum="{Binding ElementName=UserControl, Path=MaximumProperty}" Minimum="{Binding ElementName=UserControl, Path=MinimumProperty}" Value="{Binding ElementName=UserControl, Path=ValueProperty}" VerticalAlignment="Top" Width="156" />
现在,我想在同一页面中创建此
UserControl
的多个实例,并使用MVVM从代码隐藏更新
ProgressBar
。但我想不出来。我是否需要为
UserControl
创建一个ViewModel,以便每个实例都有自己的ViewModel副本

是否有方法更新页面视图模型中的所有实例

谢谢和问候,
Bharat

如果我理解正确,听起来您希望为此
UserControl
创建一个ViewModel,然后拥有该ViewModel的多个实例(视图上的
UserControl
的每个实例一个)。如果您有一个绑定了多个
UserControls
的ViewModel,那么它们将显示完全相同的内容

听起来您已经有了页面的ViewModel,因此您可以简单地将
UserControl
的ViewModel添加为页面ViewModel的属性,如下所示:

public class PageViewModel : INotifyPropertyChanged
{
    private UCViewModel _ucViewModel;

    //Other ViewModel Code

    public UCViewModel UserControlViewModel
    {
        get { return _ucViewModel; }
    }
}
<local:myControl Status="{Binding UserControlViewModel.Status}"... />
其中,UCViewModel是
用户控件的ViewModel。然后,在XAML中,只需绑定到UCViewModel上的属性,如下所示:

public class PageViewModel : INotifyPropertyChanged
{
    private UCViewModel _ucViewModel;

    //Other ViewModel Code

    public UCViewModel UserControlViewModel
    {
        get { return _ucViewModel; }
    }
}
<local:myControl Status="{Binding UserControlViewModel.Status}"... />


如果您有一个UCViewModels集合,您需要以稍微不同的方式处理它,但概念仍然是一样的。

谢谢您的回答。这正是我想做的。我有并行运行的任务,并试图通过用户控制显示每个任务的进度(UC包含标签和进度条)。我将尝试您的解决方案,然后将其更新为解决方案。ElementName应指向x:Name属性值,而不是元素类型(UserControl、TextBox等)