0

私は CommentsData クラスを持っており、これは DataGrid で値をロード、操作、および保存するために使用されます。グリッドのドロップダウンとして表示されるクラスの Status フィールドを作成したいと考えています。コメントの値は、一度だけ入力する必要があります。私は多くのバリエーションを試しましたが、これはうまくいきません。コンボは空です。コンボに値を入力できるようにする必要があり、選択が変更されたときに値がそこに残り、消えないようにする必要があります。

グリッドの Xaml は次のとおりです (更新 2)

<DataGrid Grid.Row="2" AutoGenerateColumns="False"  Height="Auto" HorizontalAlignment="Stretch" Name="grdComments" VerticalAlignment="Stretch" CanUserAddRows="True" CanUserDeleteRows="True" BeginningEdit="grdComments_BeginningEdit" InitializingNewItem="grdComments_InitializingNewItem" PreviewKeyDown="grdComments_PreviewKeyDown" SizeChanged="grdComments_SizeChanged">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Author}" Header="Author" />
    <DataGridTemplateColumn Header="Status" >
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox  ItemsSource="{Binding UserValues}" DisplayMemberPath="UserStatus" SelectedValuePath="UserStatus" SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTextColumn Binding="{Binding Path=Comment}" Header="Comment" Width="570" />
  </DataGrid.Columns>

CommentData クラスのコードは次のとおりです (更新 2)

public class CommentsData 
{

    public string Author { get; set; }
    public string Status { get; set; }
    public string Comment { get; set; }
    public string Username { get; set; }

    public ObservableCollection<StatusValue> UserValues { get; set; }

    public CommentsData()
    {
        UserValues = new ObservableCollection<StatusValue>();

        UserValues.Add(new StatusValue("New"));
        UserValues.Add(new StatusValue("Open"));
        UserValues.Add(new StatusValue("ReOpen"));
        UserValues.Add(new StatusValue("Closed"));

    }

}

public class StatusValue
{
    public string UserStatus { get; set; }

    public StatusValue (string value)
    {
        UserStatus = value;
    }
}

コメントリストが初期化されるコードは次のとおりです

private List<CommentsData> _commentsList;

private void InitializeObjects()
{
        _commentsList = new List<CommentsData>();
        grdComments.ItemsSource = _commentsList;

}

上記のコードは機能しています すべてのフィードバックに感謝します

4

3 に答える 3

1

あなたのコードに欠けていると思われるものがいくつかあります

まず、あなたのクラスはINotifyPropertyChangedを実装していません。つまり、 でプロパティが変更された場合、変更されたCommentDataことを UI に通知しないため、UI が更新されて新しい値が表示されません。

次に、各アイテムでComboBox呼び出されるプロパティがあり、それを として使用することを伝えていますが、このプロパティは には存在しません。を参照するように変更します。これは の有効なプロパティです。StatusComboBoxItem.ValueStatusValueUserStatusStatusValue

SelectedValuePath="UserStatus"

そして最後に、アイテムごとに ComboBox アイテムを再作成するべきではありません。代わりに、ViewModel 階層のさらに上のどこかにコレクションを作成するか、それを静的リソースにします。

たとえば、 のコレクションを含むクラスに のコレクションCommentsDataも含まれている場合、バインディングを使用して次のようにバインドStatusValuesできます。RelativeSource

ItemsSource="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},
    Path=DataContext.UserValues}"
于 2011-12-21T15:09:43.563 に答える
1

ドロップダウン リストを設定するためのDataGridComboBoxColumnに関する MSDN の記事に記載されているように、次のいずれかのオプションを使用して、最初に ComboBox の ItemsSource プロパティを設定する必要があります。

  • 静的リソース。
  • x:Static コード エンティティ。
  • ComboBoxItem タイプのインライン コレクション。

オブジェクト プロパティにバインドする場合は、次のようComboBox.ItemsSourceにすると簡単ですDataGridTemplateColumn

<DataGridTemplateColumn Header="Status">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
              <ComboBox ItemsSource="{Binding UserValues}" DisplayMemberPath="UserStatus" SelectedValuePath="UserStatus" SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}" />
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
于 2011-12-21T13:44:19.173 に答える
0

DataGridComboboxColumn の代わりに使用するものを次に示します。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding UserValues}" SelectedItem="{Binding Status}" DisplayMemberPath="UserStatus" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

また、 をバインドできるように、 ではなくCommentsData.Statusのタイプにする必要があります。StatusValuestringSelectedItem

于 2011-12-21T13:44:35.360 に答える