C# 将ObservableCollection绑定到DataGrid组合框?
我正在尝试将组合框的项与ObservableCollection绑定,我已成功地将它们绑定到C# 将ObservableCollection绑定到DataGrid组合框?,c#,wpf,xaml,combobox,datagrid,C#,Wpf,Xaml,Combobox,Datagrid,我正在尝试将组合框的项与ObservableCollection绑定,我已成功地将它们绑定到静态资源 XAML,护理之家名称是SQL Server表,这段代码对我来说很好用 <Window.Resources> <local:CollectionsLists x:Key="StaticNursingHomeList" /> </Window.Resources> <DataGridTemplateColumn Width="120" Head
静态资源
XAML,
护理之家名称
是SQL Server表,这段代码对我来说很好用
<Window.Resources>
<local:CollectionsLists x:Key="StaticNursingHomeList" />
</Window.Resources>
<DataGridTemplateColumn Width="120" Header="施設名称">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding UpdateSourceTrigger=PropertyChanged,
Path=Nursing_Home_Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Text="{Binding Path=Nursing_Home_Name,
UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding NursingHome,
Source={StaticResource StaticNursingHomeList}}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
我需要添加什么才能使其正确绑定?WPF中的绑定使用当前上下文的
DataContext
。在您的情况下,DataContext
属于您的main窗口
,并且知道在一个上下文中不能有两个,例如,您可以在DataGrid
中声明另一个,但您不能再使用main窗口
中的一个。
简而言之,您不能在同一上下文中绑定到
护理之家\名称
和护理之家名称
好的,那么解决办法是什么
您必须将其中一个属性带到另一个上下文中。将您的
护理之家\u名称
带到您的主窗口
更简单,如下所示:
public partial class MainWindow : INotifyPropertyChanged
{
public MainWindow()
{
DataContext = this;
InitializeComponent();
}
private ObservableCollection<string> _nursingHomeNames = new ObservableCollection<string>();
public ObservableCollection<string> NursingHomeNames
{
get { return _nursingHomeNames; }
set { _nursingHomeNames = value; }
}
public string Nursing_Home_Name //Unconventional name. But I kept your naming
{
get { return GetNursingHomeNameFromDB(); }
set
{
SaveNursingHomeName(value);
NotifyPropertyChanged("Nursing_Home_Name");
}
}
}
公共部分类主窗口:INotifyPropertyChanged
{
公共主窗口()
{
DataContext=this;
初始化组件();
}
私有ObservableCollection_nursingHomeNames=新ObservableCollection();
公众可观察的集合护理家庭名称
{
获取{return\u nursingHomeNames;}
设置{u nursingHomeNames=value;}
}
公共字符串护养院名称//非常规名称。但我保留了您的名称
{
获取{return GetNursingHomeNameFromDB();}
设置
{
SaveNursingHomeName(值);
通知财产变更(“疗养院名称”);
}
}
}
如果您实现了GetNursingHomeName fromDB
和SaveNursingHomeName
,这将起作用
最后一个提示:
ObservableCollection
不需要NotifyPropertyChanged()
它是内置的。WPF中的绑定使用当前上下文的DataContext
。在您的情况下,DataContext
属于您的main窗口
,并且知道在一个上下文中不能有两个,例如,您可以在DataGrid
中声明另一个,但您不能再使用main窗口
中的一个。
简而言之,您不能在同一上下文中绑定到
护理之家\名称
和护理之家名称
好的,那么解决办法是什么
您必须将其中一个属性带到另一个上下文中。将您的
护理之家\u名称
带到您的主窗口
更简单,如下所示:
public partial class MainWindow : INotifyPropertyChanged
{
public MainWindow()
{
DataContext = this;
InitializeComponent();
}
private ObservableCollection<string> _nursingHomeNames = new ObservableCollection<string>();
public ObservableCollection<string> NursingHomeNames
{
get { return _nursingHomeNames; }
set { _nursingHomeNames = value; }
}
public string Nursing_Home_Name //Unconventional name. But I kept your naming
{
get { return GetNursingHomeNameFromDB(); }
set
{
SaveNursingHomeName(value);
NotifyPropertyChanged("Nursing_Home_Name");
}
}
}
公共部分类主窗口:INotifyPropertyChanged
{
公共主窗口()
{
DataContext=this;
初始化组件();
}
私有ObservableCollection_nursingHomeNames=新ObservableCollection();
公众可观察的集合护理家庭名称
{
获取{return\u nursingHomeNames;}
设置{u nursingHomeNames=value;}
}
公共字符串护养院名称//非常规名称。但我保留了您的名称
{
获取{return GetNursingHomeNameFromDB();}
设置
{
SaveNursingHomeName(值);
通知财产变更(“疗养院名称”);
}
}
}
如果您实现了GetNursingHomeName fromDB
和SaveNursingHomeName
,这将起作用
最后一个提示:observateCollection
不需要NotifyPropertyChanged()
它是内置的
我需要添加什么才能使其正确绑定
由于NursingHomeNames是父窗口的属性,而ComboBox的DataContext是DataGrid的ItemsSource集合中的一个项,因此需要将该窗口指定为绑定的源。试试这个:
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=NursingHomeNames, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedItem="{Binding Path=Nursing_Home_Name}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
我需要添加什么才能使其正确绑定
由于NursingHomeNames是父窗口的属性,而ComboBox的DataContext是DataGrid的ItemsSource集合中的一个项,因此需要将该窗口指定为绑定的源。试试这个:
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=NursingHomeNames, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedItem="{Binding Path=Nursing_Home_Name}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
疗养院\名称
不是字符串,它是一个数据库表
,我绑定到该表,以便可以使用任何数据更改更新数据库。不,不,您在这里使用的方法不正确。绑定不适用于此类操作。您必须侦听属性更改事件,并在那里执行操作。请阅读我的初步解释。这两种方法SaveNursingHomeName
和GetNursingHomeNameFromDB()
看起来像什么?恐怕这不是您需要的。我不知道你的结构。在我看来,你必须有两张桌子,一张是给疗养院的,另一张是给疗养院的人的。现在在人员列表中有一个下拉列表,用于选择这些人员所在的养老院。。。。如果是这样的话,我可以帮忙,否则我需要更多的信息。请编辑您的问题。是的,我有一个表格,可以从中获取养老院的名称,并填充一个列表,如我的OP中所示。然后我使用该列表填充组合框。但是,我不想使用列表
和静态资源
进行绑定,而是想直接绑定到可观察集合
来填充组合框。养老院名称
不是字符串,这是一个数据库表
,我绑定到该表,以便用任何数据更改更新数据库。不,不,您在这里使用的方法不正确。绑定不适用于此类操作。您必须侦听属性更改事件,并在那里执行操作。请阅读我的初步解释。这两种方法SaveNursingHomeName
和GetNursingHomeNameFromDB()
看起来像什么?恐怕这不是您需要的。我不知道你的结构。我认为你必须有两个
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=NursingHomeNames, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedItem="{Binding Path=Nursing_Home_Name}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>