ComboBox中的只读项目

时间:2012-01-23 10:04:45

标签: wpf mvvm datagrid combobox

我正在使用MVVM将ComboBox绑定到我的WPF应用程序中的ObservableCollection。 但是,我需要在这个组合框中制作一个或多个项目“不可选择”。 我还要提一下,组合框用在DataGrid中。

我想,我可以使用某种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 :(得分: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的实现。