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

C# 如何在wpf中使用绑定修改列表的值,c#,wpf,data-binding,binding,C#,Wpf,Data Binding,Binding,我想要实现的是将添加到空白数据网格的值保存到列表中。我有下面的c代码# 我的WPF代码 <DataGrid x:Name="selectedDatesGridView" Grid.Column="2" Width="140" CanUserReorderColumns="True" Style="{StaticResource DataGridStyle}" Margin="0,

我想要实现的是将添加到空白数据网格的值保存到列表中。我有下面的c代码#

我的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>
当用户单击日历中的某个日期时,该日期将添加到数据网格中,但不在列表中

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


我怎样才能让它工作?谢谢你的帮助

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

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


希望这能有所帮助。

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

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


希望这有帮助。

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

具有类型为List的公共属性,并将datagrid内容绑定到该属性。 然后将其添加到该列表中。它可能会起作用,但您确实希望使用ObservaleCollection,它会通知更改,因此一旦集合更改,您将自动看到更改(额外提示,它仅在添加或删除项时才执行此操作。如果您更改了其中的项,您需要自己刷新它:)

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

这是来自一个使用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>

示例1:网格中包含项目的列表框:
在班级的某个地方:

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; }
公共InnerControlViewModel() { 如果(IsInDesignMode) { mycl=newobserveCollection(){“您处于设计模式”,“随机生成下一项:”,“}; } 其他的 { mycl=newobserveCollection(){“您处于运行时模式”,“随机生成下一项:”,“}; } 对于(int i=0;i<30;i++) { mycl.Add(“随机日期:+RandomHelper.RandomDate()); } } 公共可观测集合MyCol{get;set;} 请注意,在构造函数中,我为设计器创建了一些伪数据,并且在实时中,我得到了一些随机数据


事实上,它是一个可观察的集合,在更新内容和添加内容时首当其冲,这也会刷新视图。

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

具有类型为List的公共属性,并将datagrid内容绑定到该属性。 然后将其添加到该列表中。它可能会起作用,但您确实希望使用ObservaleCollection,它会通知更改,因此一旦集合更改,您将自动看到更改(额外提示,它仅在添加或删除项时才执行此操作。如果您更改了其中的项,您需要自己刷新它:)

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

这是来自一个使用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>

示例1:网格中包含项目的列表框:
在班级的某个地方:

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; }
公共InnerControlViewModel() { 如果(IsInDesignMode) { mycl=newobserveCollection(){“您处于设计模式”,“随机生成下一项:”,“}; } 其他的 { mycl=newobserveCollection(){“您处于运行时模式”,“随机生成下一项:”,“}; } 对于(int i=0;i<30;i++) { mycl.Add(“随机日期:+RandomHelper.RandomDate()); } } 公共可观测集合MyCol{get;set;} 请注意,在构造函数中,我为设计器创建了一些伪数据,并且在实时中,我得到了一些随机数据


事实上,它是一个可观察的集合,需要更新内容并添加到其中,这也将刷新视图。

尝试使用
可观察集合
而不是
列表
;与
列表
不同,
ObservableCollection
在项目被删除时发出通知added@ASh不,谢天谢地,我以为选定的日期会添加到
HolidayCalendarDays
集合中,datagrid会显示该集合,而calendar和datagrid不会直接通信。我不得不重新阅读这个问题-
当用户单击日历中的某个日期时,该日期被添加到datagrid中
-这部分是如何实现的?@ASh我已经添加了将所选日期添加到datagrid的代码一个简单的hack(但不是真正的wpf)将用以下代码替换
holidayCalendarDays\u SelectedDateSchenged
内容:
(selectedDatesGridView.ItemsSource as ObservableCollection)。添加(new HolidayCalendarDaysView(){DayToPlay=(DateTime)HolidayCalendarDates.SelectedDate})。应使用
observedcollection
而不是
List
更新项目资源和网格;与
列表
不同,
ObservableCollection
在项目被删除时发出通知added@ASh不,谢天谢地,我以为选定的日期会添加到
HolidayCalendarDays
集合中,datagrid会显示该集合,而calendar和datagrid不会直接通信。我不得不重新阅读这个问题-
当用户单击日历中的某个日期时,该日期被添加到datagrid中
-这部分是如何实现的?@ASh我已经添加了将所选日期添加到datagrid的代码一个简单的hack(但不是真正的wpf)将用以下代码替换
holidayCalendarDays\u SelectedDatesChanged
内容:
(selectedDatesGridView.ItemsSource作为ObservableCollection)。A
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; }