在combobox wpf中动态设置所选项目

时间:2016-11-11 04:56:21

标签: c# .net wpf combobox

我想动态选择ComboBox中的1项,因为我在DataGrid行中有很多ComboBox。我尝试使用SelectedValue或SelectedIndex,但它仍然无法正常工作。请帮我 。我的代码在这里

Xaml文件:

<DataGridTemplateColumn  Header="DataType_Id">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox Loaded="cbxDataType_Loaded" Name="cbxDataType" SelectionChanged="ComboBox_SelectionChanged" 
                     SelectedValuePath="Id"
                      DisplayMemberPath="Name"
                      ItemsSource="{Binding Path=masterData}"
                      SelectedValue="{Binding Path=ComboboxObj,Mode=TwoWay}"
                      SelectedItem="{Binding Path=seletedItem}"
                      DataContext="{Binding}">
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

ComboBox对象

public class ComboboxObj
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    //public string selectedItem { get; set; }
}

DataGrid row Object

public class ListDataExtract
{
    public SP_List_Details Detail { get; set; }
    public List<ComboboxObj> masterData { get; set; }
    public ComboboxObj seletedItem { get; set; }
}

主要流程

       for (int i = 0; i < lstDetail.Count; i++)
            {
                ComboboxObj cbxObj = new ComboboxObj();
                ListDataExtract extract = new ListDataExtract();
                extract.Detail = lstDetail[i];
                extract.masterData = lstCbx;
                // Create Seleted Item
                cbxObj.Id = lstDetail[i].DataType_Id.Value;
                cbxObj.Name = findIndexMasterData(lstDetail[i].DataType_Id.Value, lstCbx);
                // lstCbx is List Object ComboboxObj
                extract.seletedItem = lstCbx[0];
                // End Create Seleted Item
                lstExtract.Add(extract);
            }
            DataGridListDetails.ItemsSource = lstExtract;

1 个答案:

答案 0 :(得分:0)

对不起伙计,我尝试复制你的代码并弄清楚它是否有效,但它没有意义,似乎你还有很多需要学习的东西。如果你想学习WPF,你需要知道DataBinding是什么。

我的建议是:从小做起,让它成长。

首先:显示一个简单的组合框包含的字符串,从后面的代码填充(xaml.cs)。类似的东西:

<Grid>
   <ComboBox x:Name="MyCombo"></ComboBox>
</Grid>

背后的代码中
    var myComboItemsSource = new List<string>();
    MyCombo.ItemsSource = myComboItemsSource;

    myComboItemsSource.Add("hello");
    myComboItemsSource.Add("world");

然后使用数据绑定:

<ComboBox ItemsSource="{Binding MyComboItemsSource}" SelectedItem="{Binding SelectedItem}"></ComboBox>

只需从codebehind注入Datacontext:

public MainWindow()
{
    InitializeComponent();
    DataContext = new ViewModel();
}

构建视图模型:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var propertyChanged = PropertyChanged;

        propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class ViewModel : ViewModelBase
{
    private string _selectedItem;
    public List<string> MyComboItemsSource { get; }

    public string SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            NotifyPropertyChanged();
        }
    }

    public ViewModel()
    {
        MyComboItemsSource = new List<string>();
        MyComboItemsSource.Add("hello");
        MyComboItemsSource.Add("world");

        SelectedItem = MyComboItemsSource.First();
    }
}

(注意INotifyPropertyChanged的示例实现)

之后,如果您愿意,可以直接在数据网格中构建它。

让你的步伐变小。

希望它有所帮助。