将Listview中的Combobox绑定到ObservableCollection <string> </string>

时间:2014-11-14 16:43:15

标签: c# wpf xaml

XAML

<UserControl x:Class="PatientsInscrit_GMF.ListDisplay"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:custom="clr-namespace:PatientsInscrit_GMF"
             DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <ListView Grid.Row="1" Margin="0,0,0,0" x:Name ="FileList">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Tag" Width="Auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ></ComboBox>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>   
    </Grid>
</UserControl>

.CS

namespace PatientsInscrit_GMF
{
    public partial class ListDisplay : UserControl
    {
        private ObservableCollection<string> _tags;

        public ObservableCollection<string> Tags
        {
            get { return _tags; }
        }

        public ListDisplay()
        {
            InitializeComponent();
            _tags = new ObservableCollection<string>();
            List<string> tags = Facade.Instance.RetrieveTags();
            foreach(string s in tags)
            {
                _tags.Add(s);
            }
        }
    }
}

如何将标签绑定到我的Combobox,这是我列表视图中的众多列之一?

我试过

ItemsSource = "{Binding Tags}"

但是这个组合框仍然是空的。我确信Facade List检索不是空的,因为它创建时我添加了2个默认标签,因此它不是空的。

我已经尝试过各种其他解决方案,我发现并且没有任何工作,甚至还有代码示例甚至无法编译。

请帮助:)

2 个答案:

答案 0 :(得分:1)

我相信在(最初)提取Tags属性时,_tags尚未初始化。初始化_tags后,您可以提升Tags属性更改(通过实施INotifyPropertyChanged)。然而,该属性似乎只需要初始化(更改)一次。因此,实现这样的接口并不是必需的。您可以尝试以下代码以确保在获取Tags时,数据将被初始化:

public ObservableCollection<string> Tags {
   get { 
      if(_tags == null){
        //move your code after InitializeComponent() to here
        _tags = new ObservableCollection<string>();
        List<string> tags = Facade.Instance.RetrieveTags();
        foreach(string s in tags) {
            _tags.Add(s);
        }
      }
      return _tags;
   }
}

在XAML中:

<ComboBox ItemsSource="{Binding Tags,
          RelativeSource={RelativeSource AncestorType=UserControl}}"></ComboBox>

答案 1 :(得分:1)

为了DataBind,请遵循以下内容:

1)确保已将DataContext(在UserControl标记中)设置为DataContext="{Binding RelativeSource={RelativeSource Self}}"

2)您需要将ComboBox中的ItemsSource绑定更改为:ItemsSource="{Binding SomePropertyName}"

3)你需要实现`INotifyPropertyChanged&#39;在后台cs文件中

4)要实现此属性,请使用以下命令:

    #region INotifyPorpertyChanged Memebers 

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion

5)创建所需对象类型的ObservableCollection类型的属性。此属性是ComboBoxis所限定的属性。

例如:

private ObservableCollection<SomeDataType> _myPrivateData;
public ObservableCollection<SomeDataType> SomePropertyName { get { return _myPrivateData; } set    { _myPrivateData= value; NotifyPropertyChanged("SomePropertyName"); } }

负责数据绑定部分。现在每次重置DataGrid绑定到DataGrid的集合都会更新,因为调用了NotifyPropertyChanged。