ComboBox SelectedItem绑定未更新

时间:2011-06-03 11:14:33

标签: c# wpf xaml binding combobox

我有点疑惑: 这有效:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
            <Label Content="Rol" />
            <ComboBox ItemTemplate="{StaticResource listRollen}"
                      Height="23" Width="150"
                      SelectedItem="{Binding Path=SelectedRol, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                      ItemsSource="{Binding Path=allRollen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </StackPanel>

并且SelectedRol的属性是:

public TblRollen SelectedRol
    {
        get { return _selectedRol; }
        set
        {
            if (_selectedRol != value)
            {
                _selectedRol = value;
                OnPropertyChanged("SelectedRol");
            }
        }
    }

但这不起作用:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
            <Label Content="Soort" />
            <ComboBox ItemTemplate="{StaticResource listSoorten}"
                      Height="23" Width="150"
                      ItemsSource="{Binding Path=allSoorten}"
                      SelectedItem="{Binding Path=SelectedProduct, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </StackPanel>

具有以下属性SelectedProduct:

public TblProduktSoorten SelectedProduct
    {
        get { return _selectedPSoort; }
        set
        {
            if (_selectedPSoort != value)
            {
                _selectedPSoort = value;
                OnPropertyChanged("SelectedProduct");
            }
        }
    }

在我的代码中的某处我设置SelectedProduct = p.TblProduktSoorten并在调试时,我看到属性设置正确...

7 个答案:

答案 0 :(得分:5)

DataGrid中的Combobox?

如果组合框位于.then,则必须添加:

DataGrid

请参阅:https://stackoverflow.com/a/5669426/16940

答案 1 :(得分:2)

尝试使用未选择的项目,但使用值路径查看代码示例

<ComboBox Name="projectcomboBox" ItemsSource="{Binding Path=Projects}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="FullName"
          SelectedValuePath="Name"  SelectedIndex="0"  Grid.Row="1" Visibility="Visible" Canvas.Left="10" Canvas.Top="24" Margin="11,6,13,10">
</ComboBox>

绑定属性是

public ObservableCollection<Project> Projects
{
    get { return projects; }
    set
    {
        projects = value;
        RaisePropertyChanged("Projects");
    }
}

答案 2 :(得分:2)

这可能与apparently attribute order does matter这一事实有关,在第二种情况下,ItemsSourceSelectedItem声明已被交换。

答案 3 :(得分:1)

如果在属性更改事件处理程序中更改SelectedProduct时设置了SelectedProduct属性,则需要异步设置此属性。

private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "SelectedProduct")
        App.Current.Dispatcher.InvokeAsync(() => SelectedProduct = somevalue);
}

答案 4 :(得分:0)

我不知道你是否修好了,但我今天遇到了同样的问题。 通过确保选定项的集合是ObservableCollection来修复它。

答案 5 :(得分:0)

我的问题是由我自己疲倦的大脑引起的。同样的症状,也许它将使您发现问题。

设置SelectedItem必须在列表中提供一个项目! (duhh)通常这是自然发生的,但是我遇到一个情况,我从另一个服务(对象类型相同)获得了一个“角色”,并试图对其进行设置并期望组合框会发生变化! ;(

而不是-

Roles = roles;
CurrentRole = role;

记住要这样做-

Roles = roles;
CurrentRole = roles.FirstOrDefault(e=> e.ID == role.ID); //(System.Linq)

答案 6 :(得分:0)

我认为这个问题是由ItemSource的类型和SelectedItem是mitchmatched引起的

例如,如果 ItemSource 绑定到 int 列表,而 SelectedItem 绑定到 string。如果将所选项目设置为 null 或空字符串,则组合框无法知道选择了哪个项目。因此组合框将不显示任何内容。