C# 将ObservableCollection绑定到DataGrid组合框?

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

我正在尝试将组合框的项与ObservableCollection绑定,我已成功地将它们绑定到
静态资源


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>