使用MVVM模式获取WPF组合框SelectedItem属性

时间:2012-05-04 13:31:35

标签: c# wpf mvvm

我使用combobox模式将Observable集合绑定到MVVM。我可以成功绑定到combobox但现在我正在寻找获取SelectedItem的方法{1}}我的视图模型中的属性(我不能简单地调用它,因为这会制动模式)我想象的方式是必须有一些方法在XAML中创建一个指向所选的绑定项目,我以后可以在我的视图模型中使用。我似乎无法弄清楚的是如何......

关于如何实现这一目标的任何建议?

XAML

<ComboBox SelectedIndex="0" DisplayMemberPath="Text" ItemsSource="{Binding Path=DocumentTypeCmb,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
          Grid.Column="1" Grid.Row="4" Margin="0,4,5,5" Height="23"
          HorizontalAlignment="Left" Name="cmbDocumentType" VerticalAlignment="Bottom"
          Width="230" />

代码

//Obesrvable collection property
private ObservableCollection<ListHelper> documentTypeCollection = new ObservableCollection<ListHelper>();
public ObservableCollection<ListHelper> DocumentTypeCmb
{
    get
    {
        return documentTypeCollection;
    }
    set
    {
        documentTypeCollection = value;
        OnPropertyChanged("DocumentTypeCmb");
    }
}

//Extract from the method where i do the binding
documentTypeCollection.Add(new ListHelper { Text = "Item1", IsChecked = false });
documentTypeCollection.Add(new ListHelper { Text = "Item2", IsChecked = false });
documentTypeCollection.Add(new ListHelper { Text = "Item3", IsChecked = false });

DocumentTypeCmb = documentTypeCollection; 

//Helper class
public class ListHelper
{
    public string Text { get; set; }
    public bool IsChecked { get; set; }
}

3 个答案:

答案 0 :(得分:8)

试试这个:

public ListHelper MySelectedItem { get; set; }

和XAML:

<ComboBox ItemsSource="{Binding Path=DocumentTypeCmb,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
      SelectedItem={Binding MySelectedItem}
      />

您只需要在ViewModel中拥有一个获取/设置正确类型的公共属性,然后使用绑定将所选项目分配给它。请注意,SelectedItem是一个依赖项proeprty,所​​以你可以这样绑定,但对于列表控件SelectedItems(注意复数)是一个依赖属性,所以你不能将它绑定回你的VM - 为此有一个简单的解决方法来改为使用行为。

另请注意,我的示例中没有实现属性更改通知,因此如果您从VM更改所选项目,它将不会在UI中更新,但这很容易放入。

答案 1 :(得分:4)

当然,ComboBox具有SelectedItem属性。您可以在视图模型中公开属性,并在XAML中创建双向绑定。

public ListHelper SelectedDocumentType
 {
    get { return _selectedDocumenType; }
    set 
    {
        _selectedDocumentType = value;
        // raise property change notification
    }
}
private ListHelper _selectedDocumentType;

...

<ComboBox ItemsSource="{Binding DocumentTypeCmb, Mode=TwoWay}"
          SelectedItem="{Binding SelectedDocumentType, Mode=TwoWay}" />

答案 2 :(得分:1)

这个怎么样?

SelectedItem={Binding SelectedDocumentType}