2012-01-23 68 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屬性... –