使用来自不同窗口的ObservableCollection发出问题

时间:2014-02-23 07:12:54

标签: c# wpf xaml

当用户想要添加新的提醒时,他们会点击mainWindow上的添加按钮;一旦他们添加了数据,就应该使用可观察的集合在主窗口的列表框中显示它。

这会打开一个新窗口,显示日期和消息的选项。

当用户输入数据时,将调用Finish方法。

问题是,当用户在新窗口上输入完数据后,我将其添加到提醒集合中,但它不会在主窗口上更新。我想知道是否是一个datacontext问题,如果我甚至以正确的方式解决这个问题?

感谢您的帮助。

添加窗口:

    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class AddWindow : Window, INotifyPropertyChanged
    {

        private MainWindow mainW;

        public AddWindow(MainWindow mW)
        {
            InitializeComponent();

            mainW = mW;
            this.Show();

            DataContext = this;
        }

        private void Finish(object sender, RoutedEventArgs e)
        {
            mainW.Reminders.Add(new Remind(SelectedDate, Message));
            this.Close();
        }


        private DateTime selectedDate = DateTime.Today;

        public DateTime SelectedDate
        {
            get
            {
                return selectedDate;
            }
            set
            {
                if (value != selectedDate)
                {
                    selectedDate = value;
                    RaisePropertyChange("SelectedDate");
                }
            }
        }


        private string message;

        public string Message
        {
            get
            {
                return message;
            }

            set
            {
                if (message != value)
                {
                    message = value;
                    RaisePropertyChange("Message");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void RaisePropertyChange(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

添加Xaml

<TextBox Name="Time" HorizontalAlignment="Left" Height="28" Margin="124,60,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="115"/>
<DatePicker SelectedDate="{Binding SelectedDate}" HorizontalAlignment="Left" Height="28" Margin="124,27,0,0" VerticalAlignment="Top" Width="115"/>
<TextBox  Text="{Binding Msg}" HorizontalAlignment="Left" Height="58" Margin="123,93,0,0" TextWrapping="Wrap"  VerticalAlignment="Top" Width="144"/>
<Button Content="Finish" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="135,226,0,0" Click="Finish" />

主窗口:

public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();

            DataContext = this;

        }

        private ObservableCollection<Remind> reminders = new ObservableCollection<Remind>();

        public ObservableCollection<Remind> Reminders
        {
            get
            {
                return reminders;
            }
        }

        private void Add(object sender, RoutedEventArgs e)
        {
            AddWindow addWindow = new AddWindow(this);
        }
    }

Mainwindow Xaml:

                                                                      

    </MenuItem>
    <MenuItem Header="About">
        <MenuItem Header="Info"/>
    </MenuItem>
</Menu>
<Button  Content="New" HorizontalAlignment="Left" Height="26" Margin="6,279,0,0" VerticalAlignment="Top" Width="81" Click="Add" />
<Button Content ="Delete" HorizontalAlignment="Left" Height="26" Margin="87,279,0,0" VerticalAlignment="Top" Width="79" />
<Button Content="Change" HorizontalAlignment="Left" Height="26" Margin="166,279,0,0" VerticalAlignment="Top" Width="73" />
<ScrollViewer Name="Scroller" HorizontalAlignment="Left" Height="235" Margin="0,31,0,0" VerticalAlignment="Top" Width="346">
    <ListBox ItemsSource= "{Binding Reminders}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Height="41" Width="293" >
                    <TextBlock Text="{Binding Path=dateT}"/>
                    <TextBlock Text="{Binding Path=Msg}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>
</ScrollViewer>
<Separator HorizontalAlignment="Left" Height="13" Margin="0,266,0,0" VerticalAlignment="Top" Width="362"/>

提醒:

public class Remind : INotifyPropertyChanged
{
   public Remind(DateTime dt, string ms)
   {
      DateT = dt;
      Msg = ms;
   }

   private DateTime datet;

   public DateTime DateT
   {
      get
      {
         return datet;
      }
      set
      {
         if (datet != value)
         {
            datet = value;
            RaisePropertyChange("dateT");
         }
       }
   }

   private string msg;
   public string Msg
   {
      get
      {
        return msg;
      }
      set
      {
         if (msg != value)
         {
            msg = value;
            RaisePropertyChange("Msg");
         }
       }
   }


   public event PropertyChangedEventHandler PropertyChanged;

   protected void RaisePropertyChange(string name)
   {
      if (PropertyChanged != null)
      {
         PropertyChanged(this, new PropertyChangedEventArgs(name));
      }
   }
}

3 个答案:

答案 0 :(得分:1)

嗯,我用你的代码创建了一个小解决方案,它运行正常。单击完成后,主窗口列表会立即更新。唯一的小问题是你在AddWindow中使用错误的绑定消息。你绑定到“Msg”但它应该是上面第3行中的“Message”:

        <TextBox  Text="{Binding Message}" HorizontalAlignment="Left" Height="58" Margin="123,93,0,0" TextWrapping="Wrap"  VerticalAlignment="Top" Width="144"/>

答案 1 :(得分:1)

代码看起来不错,但我可以看到其中的一个问题:

AddWindow中的TextBox与Msg绑定,但后面代码中的相应属性名称为Message。因此,textBox永远不会正确绑定,因此新项目会添加到String.Empty的{​​{1}}值的集合中。

Msg

但是,即使在绑定失败的情况下,它仍应在GUI上的集合中显示一个新对象,并在AddWindow上设置空字符串和DateTime值。


有关更新的Remind类:

XAML绑定中的一个问题,即您使用字段绑定而不是它的包装属性。

<TextBox  Text="{Binding Msg}" <-- HERE. It should be Message.

答案 2 :(得分:1)

在主窗口中将日期更改为日期

<TextBlock Text="{Binding Path=DateT}"/>

你已经完成了。

在使用datacontext的底线下是好的。你错误的2个属性名称拼错了。