2012-11-15 268 views
1

我想将ComboBox的SelectedIndex属性绑定到我的ViewModel。这是代码。WPF Combobox SelectedIndex属性绑定不工作

的XAML:

<ComboBox x:Name="BloodGroupFilter" SelectedIndex="{Binding Path=SelectedBloodGroupIndex, Mode=TwoWay}"> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
      <ComboBoxItem Foreground="red" FontStyle="Italic">No Filter</ComboBoxItem> 
      <CollectionContainer Collection="{Binding Source={StaticResource BloodGroupEnum}}"/> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

视图模型

private int _selectedBloodGroupIndex = 4; 
public int SelectedBloodGroupIndex { 
    get { return _selectedBloodGroupIndex; } 
    set { 
     _selectedBloodGroupIndex = value; 
    } 
} 

正如你可以看到我想设置组合框的为 “4” 的SelectedIndex的。这不会发生,并且SelectedIndex被设置为0.另外,当用户选择组合框的特定项目时,我期望ViewModel的SelectedBloodGroupIndex属性将自己更新为当前选择的组合框项目,但是这也不会发生。 ViewModel属性永远不会被调用(set和get)。上述代码的绑定失败的任何原因。

更新

<UserControl.Resources> 
    <ObjectDataProvider x:Key="BloodGroupEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="enums:BloodGroup" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</UserControl.Resources> 
+0

如何和你在哪里实例化视图模型?你把它与视图绑定在哪里? – strmstn

+0

我怀疑你没有正确设置'DataContext'。输出窗口是否提到绑定错误? – Joulukuusi

+0

ViewModel由Caliburn Micro引导程序创建。该视图也由Caliburn创建。我在View中有一些绑定到ViewModel的控件,这些绑定工作正常。这表明View正确绑定到ViewModel。唯一不起作用的是设置Combobox的SelectedIndex,如我的问题 – Jatin

回答

1

你需要通知物业在您的视图模型的SelectedBloodGroupIndex的二传手改变。我希望你确实有PropertyChanged事件的想法。

<Window x:Class="WpfApplication4.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:myWindow="clr-namespace:WpfApplication4" 
    Title="MainWindow" Height="800" Width="800" WindowStartupLocation="CenterScreen"> 

<Grid> 
    <ComboBox SelectedIndex="{Binding SelectedIndex}"> 
     <ComboBoxItem Content="1"/> 
     <ComboBoxItem Content="2"/> 
     <ComboBoxItem Content="3"/> 
     <ComboBoxItem Content="4"/> 
     <ComboBoxItem Content="5"/> 
    </ComboBox> 
</Grid> 

public partial class MainWindow :Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new MyViewModel(); 
    } 
} 

public class MyViewModel :INotifyPropertyChanged 
{ 
    public MyViewModel() 
    { 
     SelectedIndex = 2; 
    } 
    private int _selectedIndex; 
    public int SelectedIndex 
    { 
     get 
     { 
      return _selectedIndex; 
     } 
     set 
     { 
      _selectedIndex = value; 
      Notify("SelectedIndex"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void Notify(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

我不认为PropertyChanged在当前场景中有什么要做的。不过,我在SelectedBloodGroupIndex的setter中添加了代码,但它没有任何好处。问题是Setter/Getter没有在设置中随时调用。 – Jatin

+0

我已经用例子更新了解决方案。如果它不能像这样工作,那么问题在于你的绑定。 – ethicallogics

+0

不错,但是'INotifyPropertyChanged'只有在从ViewModel更新视图时才有用。 OP在View中更新ViewModel时存在问题,并且getter和setter甚至不会被调用。 – Joulukuusi