从WPF中的视图模型动态通知视图

从WPF中的视图模型动态通知视图,wpf,xaml,data-binding,mvvm,user-controls,Wpf,Xaml,Data Binding,Mvvm,User Controls,在我的WPF应用程序中,我必须创建一个对象设计器。此设计器是许多其他用户控件的列表视图(自定义网格包含costum stackpanel,其中包含…包含要显示的自定义对象) 因此,为了更好地构造我的设计器,我为每个层次创建了一个模板,并将其放在视图中(作为用户控件)。同时,我为每个视图创建了相应的视图模型 为了将视图绑定到它们的视图模型,我在App.xaml文件中输入了以下代码: <Application.Resources> <DataTemplate DataTyp

在我的WPF应用程序中,我必须创建一个对象设计器。此设计器是许多其他用户控件的列表视图(自定义网格包含costum stackpanel,其中包含…包含要显示的自定义对象)

因此,为了更好地构造我的设计器,我为每个层次创建了一个模板,并将其放在视图中(作为用户控件)。同时,我为每个视图创建了相应的视图模型

为了将视图绑定到它们的视图模型,我在App.xaml文件中输入了以下代码:

<Application.Resources>
    <DataTemplate DataType="{x:Type ViewModel:DesignerViewModel}">
        <View:Designer />
    </DataTemplate>
    <DataTemplate DataType="{x:Type ViewModel:FirstLevelViewModel}">
        <View:FirstLevel />
    </DataTemplate>
    <DataTemplate DataType="{x:Type ViewModel:SecondLevelViewModel}">
        <View:Secondlevel />
    </DataTemplate>
    <DataTemplate DataType="{x:Type ViewModel:ThirdLevelViewModel}">
        <View:Thirdlevel />
    </DataTemplate>
    <DataTemplate DataType="{x:Type ViewModel:CircleViewModel}">
        <View:Circle />
    </DataTemplate>
    <DataTemplate DataType="{x:Type ViewModel:RectangleViewModel}">
        <View:Rectangle />
    </DataTemplate>
</Application.Resources>

它在我第一次加载应用程序时工作(我认为这是因为绑定只有在视图的构造函数处于创建状态时才能完成)。但在此之后,视图模型中的每一次修改都不会自动通知视图

我找到的唯一解决方案是在任何视图模型修改后重新创建我的designer视图

有谁有更好的解决方案吗??因为我认为我的解决方案不是很干净

NB:我在所有viewModels中实现了InotifyProperty更改。

更新>>>

因此,我将举一个例子:

这是我的设计师Xaml:

<Grid>
    <ListView SelectionMode="Single"
    VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
    ItemsSource="{Binding FirstLevelViewModelList}" >

        <ListView.ItemTemplate>
            <DataTemplate>
              <View:FirstLevel HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</Grid>

这是我的DesignerViewModel类:

 public class DesignerViewModel : AViewModel
{
    #region Property

    public int FirstLevelCounter
    {
        get;
        set;
    }

    private List<FirstLevelViewModel> FirstLevelViewModelList;

    public List<FirstLevelViewModel> FirstLevelViewModelList
    {
        get { return FirstLevelViewModelList; }
        set { FirstLevelViewModelList = value; 
OnPropertyChanged("FirstLevelViewModelList"); }
    }

    #region Constructor

    /// <summary>
    /// Constructor
    /// </summary>
    private DesignerViewModel()
    {
        FirstLevelViewModelList = new List<FirstLevelViewModel>();
        FirstLevelCounter = 0;

    }

    private static DesignerViewModel instance = null;
    private static readonly object padlock = new object();

    public static DesignerStringViewModel Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new DesignerViewModel();
                }
                return instance;
            }
        }
    }
 }
公共类设计服务模型:AViewModel
{
#区域属性
公共一级计数器
{
得到;
设置
}
私有列表FirstLevelViewModelList;
公共列表FirstLevelViewModelList
{
获取{return FirstLevelViewModelList;}
设置{FirstLevelViewModelList=value;
OnPropertyChanged(“FirstLevelViewModelList”);}
}
#区域构造函数
/// 
///建造师
/// 
私有设计服务模型()
{
FirstLevelViewModelList=新列表();
FirstLevelCounter=0;
}
私有静态DesignerViewModel实例=null;
私有静态只读对象挂锁=新对象();
公共静态设计器stringviewmodel实例
{
得到
{
锁(挂锁)
{
if(实例==null)
{
实例=新设计服务模型();
}
返回实例;
}
}
}
}
这是我的第一级Xaml:

<Grid>
    <ListView SelectionMode="Single"
    VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
    ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding SecondLevelViewModelList}" BorderBrush="Transparent" Background="Transparent" Height="auto">
    </ListView>
</Grid>

最后,这里是我的第一个LevelViewModel类:

 public class DesignerViewModel : AViewModel
{
    #region Property

    public int FirstLevelCounter
    {
        get;
        set;
    }

    private List<FirstLevelViewModel> FirstLevelViewModelList;

    public List<FirstLevelViewModel> FirstLevelViewModelList
    {
        get { return FirstLevelViewModelList; }
        set { FirstLevelViewModelList = value; 
OnPropertyChanged("FirstLevelViewModelList"); }
    }

    #region Constructor

    /// <summary>
    /// Constructor
    /// </summary>
    private DesignerViewModel()
    {
        FirstLevelViewModelList = new List<FirstLevelViewModel>();
        FirstLevelCounter = 0;

    }

    private static DesignerViewModel instance = null;
    private static readonly object padlock = new object();

    public static DesignerStringViewModel Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new DesignerViewModel();
                }
                return instance;
            }
        }
    }
 }
公共类FirstLevelViewModel:AViewModel { #区域属性

    private List<SecondLevelViewModel> SecondLevelViewModelList;
    public List<SecondLevelViewModel> SecondLevelViewModelList
    {
        get { return SecondLevelViewModelList; }
        set { SecondLevelViewModelList = value; 
OnPropertyChanged("SecondLevelViewModelList"); }
    }


    #region Constructor


    public FirstLevelViewModel()
    {
        SecondLevelViewModelList = new List<SecondLevelViewModel>();

    }

    #endregion 

}
私有列表二级视图模型列表;
公共列表二级视图模型列表
{
获取{return SecondLevelViewModelList;}
设置{SecondLevelViewModelList=value;
OnPropertyChanged(“SecondLevelViewModelList”);}
}
#区域构造函数
公共FirstLevelViewModel()
{
SecondLevelViewModelList=新列表();
}
#端区
}

END-UPDATE>>>

您的视图模型需要实现
INotifyPropertyChanged
并在其属性更改时引发
PropertyChanged
事件。

普通列表不实现这一必要的功能,与INotifyPropertyChanged类似,它告诉WPF和绑定引擎某些内容已更改,因此视图可以更新

您有两个选择:

  • 使用而不是列表
  • 创建自己的集合类型并实现INotifyCollectionChanged

  • 我当然做到了!!但我认为问题在于将绑定放在App.Xaml中!所以在完成创作之后。。。装订丢了@阿尔瓦罗:不,事情不是这样的。也许您需要提供更多关于代码的信息。