0

在我的 WPF 应用程序中,我必须创建一个对象设计器。该设计器是许多其他用户控件的 ListView(自定义网格,其中包含 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>

它在我第一次加载应用程序时起作用(我认为是因为绑定仅在视图的构造函数正在创建时完成)。但在那之后,视图模型中的每一次修改都不会自动通知视图!

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

有没有人有更好的解决方案??因为我认为我的解决方案不是很干净!

注意:我在所有视图模型中实现了 INotifyPropertyChanged。

更新>>>>

所以,我举个例子:

这是我的设计师 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;
            }
        }
    }
 }

这是我的 FirstLevel 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>

最后,这是我的 FirstLevelViewModel 类:

公共类 FirstLevelViewModel : AViewModel { #region 属性

    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 

}

结束更新>>>>>

4

2 回答 2

2

普通列表不实现INotifyCollectionChanged,这是必要的,类似于 INotifyPropertyChanged 告诉 WPF 和绑定引擎某些内容已更改,以便视图可以更新。

你有两个选择:

  1. 使用ObservableCollection而不是 List
  2. 创建自己的集合类型并实现 INotifyCollectionChanged
于 2013-09-17T09:39:29.507 回答
0

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

于 2013-09-17T08:58:27.147 回答