1

最初にこれをPRISM4フォーラムに投稿しましたが、このフォーラムも試してみるべきだという提案がありました:)私はWPF4を使用しています...

私はPRISM4を実行していますが、データバインディングを機能させるのに苦労しています。私はMVVMパターンに従っていて、最初にRDBMSからデータをロードし、それをICollectionViewでラップするビューモデルを持っています。これは完全に機能し、データはバインドされたDatGridに表示されますが、以下で宣言されたDataGridに表示されるデータに加えられた変更を永続化します。

ビューモデルは、読み取り/書き込みプロパティ「Results」を介してICollectionViewを公開します。これは、ご覧のとおり、「TwoWay」のバインディングモードを備えています。チェックボックスの状態に加えられた変更を保持するにはこれで十分だと思いましたが、そうではありません:(これを実現するためにいくつかの方法を試しましたが、チェックボックスの状態はビューモデルに伝播されません。 ICommandオブジェクトである「PlotClicked」メソッドの呼び出しをインターセプトしましたが、渡される引数には変更されていない「Plot」属性があります。これは、列ヘッダーの1つをクリックしてビューを並べ替えると、特に明白になります。チェックされた行はチェックボックスをオフにすると、データベースから取得したときのチェックボックスのデフォルトの状態になります。

私はここで何が間違っているのですか?

事前に感謝します-私は本当にここで立ち往生しています:(/ Peter

<DataGrid Grid.Row="0" Name="gridResults" ItemsSource="{Binding Results,Mode=TwoWay}" AutoGenerateColumns="False">
 <DataGrid.Columns>
  <DataGridTemplateColumn Header="Plot">
   <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
     <CheckBox IsChecked="{Binding Path=Plot, Mode=TwoWay}"
         HorizontalAlignment="Center" 
         Command="{Binding Path=DataContext.PlotClicked,Mode=OneWay, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}" 
         CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}"/>
    </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
  </DataGridTemplateColumn>

..。

私は私に指摘された提案を試してみました。これは私がやったことです:

  1. ビューモデルで、ResultプロパティをICollectionViewからOCに変更しました

    public ObservableCollection Results {get; セットする; }

  2. ビューを構成するUserControl用に次のテンプレートリソースを追加しました

  3. 「列」セクションのDataGridに次のコードを追加しました

        <DataGridTemplateColumn
            Header="cbTest"
            x:Name="cbTest"
            CellTemplate="{StaticResource IsSelectedColumnTemplate}"
            CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}"
            CanUserSort="True"
            Width="Auto"
            />
    

これらの変更を行った後、上記の(2)のIsChecked = "{Binding言及...でUpdateSourceTriggerのさまざまな設定を試しましたが、効果はありませんでした。チェックボックスに加えた変更は、ビューモデルのObservableCollectionに転送されません。 。

繰り返しになりますが、ここで私を助けてくれてありがとう!

*更新* 今私は本当に不気味な何かを経験しました:(これは私がしたことです:

public class ResultViewResult : IReslutViewResult
{
    public bool Plot { get; set; }
    public Guid ResultId { get; set; }
    public DateTime Generated { get; set; }
    public int Duration { get; set; }
    ...

これは、DataGridのチェックボックス列をクリックして「プロットプロパティ」をtrueに設定できないという意味では機能しませんでした。今、私は次のことをしました:

public class ResultViewResult : IReslutViewResult
{
    private bool _plot;
    public bool Plot
    {
        get
        {
            return _plot;
        }
        set
        {
            _plot = value;
        }
    } 
    public Guid ResultId { get; set; }
    public DateTime Generated { get; set; }
    public Guid ResultId { get; set; }
    public DateTime Generated { get; set; }
    public int Duration { get; set; }
    ...

あなたが尋ねるかもしれない結果?それは動作し、「プロット」は正しく設定されています!さて、これは変だと思いました!!! だから私がしたことは次のとおりでした(単にプライベート変数とget / setコードをコメントアウトする):

public class ResultViewResult : IReslutViewResult
{
    public bool Plot { get; set; }
    //private bool _plot = false;
    //public bool Plot
    //{
    //    get
    //    {
    //        return _plot;
    //    }
    //    set
    //    {
    //        _plot = value;
    //    }
    //} 
    public Guid ResultId { get; set; }
    public DateTime Generated { get; set; }
    public int Duration { get; set; }
    ...

さて、結果はどうですか?できます!!!???私はびっくりしました...つまり、最初と最後の違いは何ですか???? 私はこれについて非常にぎこちなく感じます-私はここで舞台裏で何が起こっているのか知りたいという意味です...:(

4

2 に答える 2

0

これがあなたの場合の問題かどうかはわかりませんが、DataGrid は、行から移動するまでソースへの変更をコミットしないデータバインディングのバリエーションを使用します。これは BindingGroup と呼ばれます。行からまだ移動していないため、値がコミットされていない可能性がありますか?

http://blogs.msdn.com/b/vinsibal/archive/2008/08/11/wpf-3-5-sp1-feature-bindinggroups-with-item-level-validation.aspx

もう1つの可能性は、バインディングパスが何らかの形で正しくないということですか? VS の出力ウィンドウをチェックして、バインディング パスの失敗が報告されているかどうかを確認しましたか?

于 2011-07-25T13:26:24.597 に答える
0

それについてはわかりませんが、ObservableCollection使用済みの asを試してみることをお勧めしますItemsSource。私は以前にそのような多くの問題を抱えていました.それらはすべてこの種のコレクションを使用して解決されました.

また、IsCheckedバインディングに次を追加してみてくださいUpdateSourceTrigger=PropertyChanged

于 2011-07-25T09:11:10.893 に答える