2012-01-23 64 views
0

我正在使用MVVM将ComboBox绑定到我的WPF应用程序中的ObservableCollection。 但是,我需要在此组合框中使一个或多个项目“不可选”。 我还应该提到,组合框被用于DataGrid。ComboBox中的只读项目

我想,我可以使用某种ValueConverter。但我无法弄清楚如何。

当前XAML:

<DataGridTemplateColumn Width="Auto"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Type.Name}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <StackPanel DataContext="{Binding DataContext.CurrentListUser, 
               RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"> 
       <ComboBox ItemsSource="{Binding Types}" 
          DisplayMemberPath="Name" 
          SelectedValue="{Binding TypeId, 
              Mode=TwoWay, 
              UpdateSourceTrigger=PropertyChanged}" 
          SelectedValuePath="Id" /> 
      </StackPanel> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 
+1

根据您确定哪些项目应为只读? –

+0

“只读”和“不可选择”对我来说是两种不同的东西 - 你想要什么? – blindmeis

回答

1

你可以用你绑定到组合框在专用视图模型类的数据对象。添加以查看模型类布尔属性,如IsReadOnly,然后根据IsReadOnly属性的值适当地采取行动。例如

public class Artist 
{ 
    public string Name { get; set; } 
} 

public class ArtistViewModel 
{ 
    private Artist artist; 

    public ArtistViewModel(Artist artist) 
    { 
     this.artist = artist; 
    } 

    public bool IsReadOnly { get; set; } 

    public string Name 
    { 
     get { return artist.Name; } 
     set 
      { 
       if (IsReadOnly) 
       { 
        throw new InvalidaOpertationException(); 
       } 
       artist.Name = value; 
      } 
    } 
} 

public class MainViewModel 
{ 
    public ObservableCollection<ArtistViewModel> Artists { get; private set; } 
} 

在MainViewModel中,您可以为单个ArtistViewModel对象设置IsReadOnly属性。 ComboBox绑定到MainViewModel的Artists属性。 为简洁起见,我省略了VM类的INotifyPropertyChanged的实现。

+0

哦。我的错。我的帖子写得太快了。我真正想要做的是让项目“不可选”。我知道它完全不同。我已更新了我的原始帖子。 –

+0

我明白了!我用一个绑定到IsReadOnly属性的触发器为ComboboxItem创建了一个Style。我使用这个触发器来设置项目的IsEnabled属性... –