WPF Combobox,绑定一个集合<items>,其中item具有bool属性isSelected?</items>

时间:2013-02-10 03:32:24

标签: wpf binding combobox selecteditem

我有一个List&lt;版本&GT;其中Version和VersionUUID,Label,SKU和IsSelected属性。我想将它绑定到一个Combobox并让所选项目只选择IsSelected标志(未选择任何先前设置的标志)。

注意:组合框位于模板中,在数据网格单元格中使用,因此我不能将SelectedItem绑定到模型中!

我到目前为止工作,datagrid按预期更新数据库,但初始值未设置onLoad。如果一个版本已经有一个IsSelected = true,我想在Combobox中显示它,但它总是空的,除非我从列表中选择一个。

    <DataTemplate x:Key="dtDatagridVersionSelector">
        <ComboBox Margin="0" Width="90"  Style="{StaticResource DatagridComboBox}"
                  ItemsSource="{Binding Path=Versions, Mode=OneTime}">
            <ComboBox.ItemTemplate >
                <DataTemplate >
                    <RadioButton Focusable="false"  IsEnabled="true" 
                                  GroupName="{Binding VersionUUID}" 
                                  IsChecked="{Binding IsSelected, Mode=TwoWay}">
                        <StackPanel Orientation="Horizontal" >
                            <TextBlock Margin="3,0,0,0"  Text="{Binding Label}"/>
                            <TextBlock Foreground="Red" Margin="3,0,0,0" 
                                       Text="{Binding SKU}"/>
                        </StackPanel>
                    </RadioButton>
                </DataTemplate>
            </ComboBox.ItemTemplate>
            <ComboBox.ItemContainerStyle>
                <Style TargetType="ComboBoxItem">
                    <Setter Property="IsSelected" 
                        Value="{Binding IsSelected, Mode=OneWay}" />
                </Style>
            </ComboBox.ItemContainerStyle>
        </ComboBox>
    </DataTemplate>

另外,Radiobox的使用并不是一成不变的,如果有更好的解决方案来实现这一点,那么只有一个项目被选中,我全都开放了

任何指针的Thanx 安德烈亚斯

1 个答案:

答案 0 :(得分:0)

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <local:SelectedItemConverter x:Key="selectedItemConverter"/>
</Window.Resources>
<Grid>
    <ComboBox ItemsSource="{Binding Students}" SelectedItem="{Binding Students, Converter={StaticResource selectedItemConverter}}" DisplayMemberPath="Name"/>
</Grid>

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Students = new ObservableCollection<Student>();
        Students.Add(new Student() { Name = "HArish", RollNo = 1, IsSelected = false });
        Students.Add(new Student() { Name = "Arev", RollNo = 2, IsSelected = false });
        Students.Add(new Student() { Name = "Pankaj", RollNo = 3, IsSelected = true });
        Students.Add(new Student() { Name = "Deepak", RollNo = 4, IsSelected = false });
        DataContext = this;
    }
    public ObservableCollection<Student> Students { get; set; }
}
public class Student
{
    public string Name { get; set; }
    public int RollNo { get; set; }
    public bool IsSelected { get; set; }
}

public class SelectedItemConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null && value is IEnumerable<Student>)
            return ((IEnumerable<Student>)value).Where(s => s.IsSelected).FirstOrDefault();
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

我希望这会有所帮助。