2012-11-15 236 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