【问题标题】:wpf datagrid: Make cell Editable and non-Editablewpf datagrid:使单元格可编辑和不可编辑
【发布时间】:2013-11-23 05:54:57
【问题描述】:

我有一个包含 2 列的数据网格,一个是 DataGridComboBox,即“序列号”列,另一个是 DataGridTextColumn,即“数量”。DataGridComboBox 列中可能有也可能没有值。如果组合框有值,则用户可以选择一个从中获取值,然后数量列变为不可编辑(只读)并将 1 设置为默认数量,否则它变为可编辑单元格,因此用户可以在其上输入任何数量。如何根据值使数量列可编辑和不可编辑从组合框中选择?

【问题讨论】:

  • 请发布一些代码,以了解您尝试过的内容。

标签: c# wpf datagrid


【解决方案1】:

你可以试试这样的

  <Grid>
    <DataGrid ItemsSource="{Binding A}"  AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Choose" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding ListOfValues}" SelectedValue="{Binding Selected, UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Value">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>

                        <TextBox Text="{Binding Selected, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding ValueAvalible}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid

到目前为止,在 Cell Demplate 中,我只放置了 TextBox 并将 ValueAvalible 绑定到 readonly 属性。您还可以同时拥有标签和文本框,并且可以将 ValueAvalible 绑定到标签和文本框的可见性。如果值可用,您可以隐藏文本显示标签。如果组合框中没有值,您可以隐藏标签并显示文本框,这将提供更好的用户体验,如下所示

<StackPanel>
     <Label Content="{Binding Selected}" Visibility="{Binding ValueAvalible, Converter={StaticResource ResourceKey=booleanToVisiblity}}"/>
      <TextBox Text="{Binding Selected, UpdateSourceTrigger=PropertyChanged}"  Visibility="{Binding ValueAvalible, Converter={StaticResource ResourceKey=invertedBooleanToVisiblity}}"/>
</StackPanel>

在您的视图模型中

class ViewModel
{
    public ObservableCollection<Values> A
    {
        get;
        set;
    }

    public ViewModel()
    {
        A = new ObservableCollection<Values>();
        Values vv = new Values();
        vv.ListOfValues = new ObservableCollection<string>();
        vv.ListOfValues.Add("1");
        vv.ListOfValues.Add("2");
        vv.Selected = vv.ListOfValues[0];
        vv.ValueAvalible = true;
        A.Add(vv);
        A.Add(new Values());
    }
}

public class Values : NotifiyPropertyChanged
{
    public ObservableCollection<string> ListOfValues
    {
        get;
        set;
    }
    private string selectedValue;
    public string Selected
    {
        get
        {
            return selectedValue;
        }
        set
        {
            selectedValue = value;
            Notify("Selected");
        }
    }

    public bool ValueAvalible
    {
        get;
        set;
    }

}

public class NotifiyPropertyChanged : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void Notify(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多