【问题标题】:Problem showing selected value of combobox when it is bind to a List<T> using Linq to Entities使用 Linq to Entities 绑定到 List<T> 时显示组合框的选定值的问题
【发布时间】:2010-01-29 05:53:16
【问题描述】:

我有一个ComboBox,它上面应用了一个ItemTemplate,并使用linq 绑定到实体返回的List。我正在使用 mvvm。它已成功绑定到它,但是当我在运行时从代码中设置它的选定值以显示来自 db 的选定值时,它不会选择它。这里的参考是我的ComboBox xaml。

<DataTemplate x:Key="ManufacturerDataTemplate">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50"/>     
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>    
        <Image x:Name="imgManufacturer" Width="25" Height="25"
               Source="{Binding Path=ManufacturerImage}" Grid.Column="0"/>
        <TextBlock x:Name="txtManufacturer" Grid.Column="1" HorizontalAlignment="Left"
                   VerticalAlignment="Center" Text="{Binding Path=ManufacturerName}"
                   Tag="{Binding Path=ManufacturerID}"/>
    </Grid>
</DataTemplate>


<ComboBox x:Name="cboManufacturer" 
          SelectionChanged="cboManufacturer_SelectionChanged"
          ItemsSource = "{Binding Path=CurrentManufacturers}"                        
          SelectedValue="{Binding Path=SelectedManufacturer}"                        
          Grid.Column="3" Grid.Row="2"  Margin="20,9.25,68,7.75"  
          ItemTemplate="{StaticResource ManufacturerDataTemplate}" TabIndex="6"/>

这是我在 viewModel 后面的代码部分。

List<tblManufacturer> currentManufacturers
        = new List<tblManufacturer>();

tblManufacturer selectedManufacturer = null;

public List<tblManufacturer> CurrentManufacturers
{
    get
    {
        return currentManufacturers;
    }
    set
    {
        currentManufacturers = value;
        NotifyPropertyChanged("CurrentManufacturers");
    }
}

public tblManufacturer SelectedManufacturer
{
    get
    {
        return selectedManufacturer;
    }
    set
    {
        selectedManufacturer = currentManufacturers.Where(mm => mm.ManufacturerID == Convert.ToInt32(selectedDevice.tblManufacturer.EntityKey.EntityKeyValues[0].Value)).First();
        NotifyPropertyChanged("SelectedManufacturer");
    }
}

【问题讨论】:

    标签: wpf linq data-binding mvvm combobox


    【解决方案1】:

    这里是示例代码sn-p:

    组合框的 Xaml:

     <ComboBox ItemsSource="{Binding ManufacturerList}" DisplayMemberPath="Name" SelectedValuePath="ID"
                  SelectedItem="{Binding SelectedManufacturer}"/>
    

    ViewModel 代码:

     public class Manufacturer
    {
        public int ID { get; set; }
    
        public string Name { get; set; }
    }
    
    
    
    
    
     private List<Manufacturer> _manufactuerlist;
       private Manufacturer _selectedManufacturer;
    
     private void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
    #region INotifyPropertyChanged Members
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            #endregion
        public Manufacturer  SelectedManufacturer
        {
            get
            {
              return _selectedManufacturer;
            }
            set
            {
                _selectedManufacturer = value;
                NotifyPropertyChanged("SelectedManufacturer");
            }
        }
    
        public List<Manufacturer> ManufacturerList
        {
            get
            {
                return _manufactuerlist;
            }
            set
            {
                _manufactuerlist = value;
                NotifyPropertyChanged("ManufacturerList");
            }
        }
    

    最后在您的视图模型中设置选定的制造商,如下所示:

    SelectedManufacturer = _manufactuerlist.Find(m => m.ID == 2);
    

    【讨论】:

    • 我有一个应用于组合框的 DataTemplate,因此我无法设置 displaynamepath 属性。请告诉其他方法。
    • 对不起,上面的评论写错了。您的代码帮助我解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2015-05-24
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多