如何使用wpf中的绑定修改列表的值

时间:2016-02-18 08:23:32

标签: c# wpf data-binding binding

我想要实现的是将添加到空白数据网格的值保存到List。我在c#

中有以下代码
public class HolidayCalendarView
{
   public List<HolidayCalendarDaysView> HolidayCalendarDays { get; set; }
}

HolidayCalendarDaysView类

public class HolidayCalendarDaysView
{
    public int HolidayID { get; set; }
    public DateTime DayToPlay { get; set; }
    public HolidayBehaviourType HolidayBehaviourType { get; set; }
}

我的WPF代码

<DataGrid x:Name="selectedDatesGridView" 
          Grid.Column="2"  
          Width="140" 
          CanUserReorderColumns="True" 
          Style="{StaticResource DataGridStyle}" 
          Margin="0,0,5,0">
    <DataGrid.Columns>
       <DataGridTextColumn 
               Header="{x:Static resx:Resources.WordSelectedDates}" 
               Binding="{Binding DayToPlay, Mode=TwoWay, StringFormat={}{0:dd/MM/yyyy}}"  
               Width="1.5*" />
    </DataGrid.Columns>
</DataGrid>

我在表单的构造函数中设置:

this.selectedDatesGridView.ItemsSource = holidayCalendarView.HolidayCalendarDays;

当用户点击日历中的日期时,日期会添加到数据网格中,但不会添加到列表中

    private void holidayCalendarDays_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
    {
        selectedDatesGridView.Items.Add((DateTime)holidayCalendarDays.SelectedDate);
        selectedDatesGridView.Items.Refresh();
    }

When the user clicks a date in the calendar the date is added to the datagrid but not in the list

我怎样才能让它发挥作用?谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

很抱歉,这个答案必须是评论。

正如@Ash在他的评论中所建议的那样,使用observablecollection并注意一件重要的事情是,实现INotifyPropertyChanged接口,在UI和业务逻辑之间交换数据(希望你使用的是MVVM)。还使用绑定模式设置为twoway设置ItemSource。

希望这有帮助。

答案 1 :(得分:0)

您的代码会将其添加到数据网格中,但不会更新列表。

拥有List类型的公共属性,并将datagrid内容绑定到它。 然后添加到该列表。它可能工作,但你真的想使用ObservableCollection,它通知变化,所以一旦集合发生变化,你会自动看到变化(额外的提示,它只会在添加或删除项目时这样做)如果你更换了一个项目,你需要自己清理它:)

我会尝试在一分钟内给你一些代码

这是来自一个使用MVVM Light的项目,但想法是一样的。

在xaml中。请注意ItemSource和绑定。

<Grid ToolTip="Notice that the scrollview works inside the Grid.">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
      </Grid.RowDefinitions>
    <TextBlock >Example 1: ListBox with items inside a Grid: </TextBlock>
    <ListBox Grid.Row="1" ItemsSource="{Binding MyCol}"></ListBox>
</Grid>

课堂上的某个地方:

public InnerControlViewModel()
{
    if (IsInDesignMode)
    {
        MyCol = new ObservableCollection<string>() {"You are in design mode", "Next items are randomly generated:", " "};
    }
    else
    {
        MyCol = new ObservableCollection<string>() { "You are in runtime mode", "Next items are randomly generated:", " " };
    }

    for (int i = 0; i < 30; i++)
    {
        MyCol.Add("Random Date: " + RandomHelper.RandomDate());
    }

}

public ObservableCollection<string> MyCol { get; set; }

请注意,在构造函数中,我为设计器创建了一些虚假数据,实时我得到了一些随机数据。

事实上,它是一个可观察的集合,首当其冲的是更新事物,并且添加它,也会刷新视图。