简体   繁体   English

绑定到组合框控件模板项失败

[英]Binding to the combobox control template item failed

I'm using the combobox and binding through List values as like below 我正在使用组合框并通过List值绑定,如下所示

    <ComboBox ItemsSource="{Binding}" Name="testCombo" Margin="67,48,184,204">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBox  Text="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=ComboBox},Mode=OneWay,Path=SelectedItem}" Width="100" Height="50" />
            </DataTemplate>
        </ComboBox.ItemTemplate>            
    </ComboBox>

binding data like below in c# c#中的绑定数据如下所示

      IList<string> objLoadData = new List<String> { "Ramesh", "Suresh" };
      testCombo.DataContext = objLoadData;    

I tried to bind the data into textbox, but I couldn't. 我试图将数据绑定到文本框中,但我不能。 How do bind datas to textbox? 如何将数据绑定到文本框?

If your list is just strings just Text="{Binding}" should work 如果你的列表只是字符串,那么Text="{Binding}"可以了

You should think about using an ObservableCollection for your ItemsSource as it will automaticly update the ComboBox when Items change (add/remove etc) 您应该考虑为ItemsSource使用ObservableCollection ,因为它会在Items更改时自动更新ComboBox (添加/删除等)

<Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <ComboBox ItemsSource="{Binding ComboItems}" Margin="67,48,184,204">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}" Width="100" Height="50" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </Grid>
</Window>

Code: 码:

public partial class MainWindow : Window
{
    private ObservableCollection<string> _comboItems = new ObservableCollection<string>();

    public MainWindow()
    {
        InitializeComponent();
        ComboItems.Add("Stack");
        ComboItems.Add("Overflow");
    }

    public ObservableCollection<string> ComboItems
    {
        get { return _comboItems; }
        set { _comboItems = value; }
    }
}

If you want to use a TextBox in the ComboBox you will probably want to use an object as the backing store for the string that implements INotifyPropertyChanged this way eveyything is updated and kept in sync. 如果你想在ComboBox使用TextBox ,你可能希望使用一个对象作为实现INotifyPropertyChanged的字符串的后备存储,这样eveyything就会被更新并保持同步。

Example: 例:

<Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <ComboBox ItemsSource="{Binding ComboItems}" Margin="67,48,184,204">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Name}" Width="100" Height="50" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </Grid>
</Window>

Code: 码:

public partial class MainWindow : Window
{
    private ObservableCollection<MyItem> _comboItems = new ObservableCollection<MyItem>();

    public MainWindow()
    {
        InitializeComponent();
        ComboItems.Add(new MyItem { Name = "Stack" });
        ComboItems.Add(new MyItem { Name = "Overflow" });
    }

    public ObservableCollection<MyItem> ComboItems
    {
        get { return _comboItems; }
        set { _comboItems = value; }
    }
}

public class MyItem : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; NotifyPropertyChanged("Name"); }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

Try this; 尝试这个;

Inside constuctor 内部构造

testCombo.DataContext = this;
testCombo.ItemsSource = objLoadData;  

In XAML 在XAML中

   <ComboBox Name="testCombo" Width="100" Height="50" >
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Mode=OneWay}" Width="100" Height="50" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM