5

私はDataGridアイテムのコレクション(ルール)にバインドされています。SelectedItemDataGridでこれらの項目の1つを手動で編集すると、グリッドのバインディングが機能しなくなったように見えます(RuleListViewModelPropertyChangedコントローラーでは二度と呼び出されません)。ただし、セル内のアイテムの値を実際に変更した場合にのみ、それ以外の場合SelectedItemは正常に機能し続けます。

私はいくつかの無関係なもののコードを取り除いたので、これは基本的に私が持っているものです。まず、私は次のものを持っていますDataGrid

<DataGrid x:Name="RuleTable" Grid.Row="1" Grid.ColumnSpan="2" ItemsSource="{Binding Rules}" SelectedItem="{Binding SelectedRule, Mode=TwoWay}" 
               BorderThickness="0" >
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding TargetValue, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, 
                                  ValidatesOnExceptions=True, NotifyOnValidationError=True}" 
                                Header="{x:Static p:Resources.TargetValue}" Width="*" ElementStyle="{StaticResource TextCellElementStyle}"
                                EditingElementStyle="{StaticResource TextCellEditingStyle}"/>
        </DataGrid.Columns>
    </DataGrid>

次のViewModelようになります。

public class RuleListViewModel : ViewModel<IRuleListView>
{
    private IEnumerable<Rule> rules;
    private Rule selectedRule;

    public RuleListViewModel(IRuleListView view)
        : base(view)
    {
    }

    public RuleListViewModel() : base(null) {}

    public IEnumerable<Rule> Rules
    {
        get
        {
            return rules;
        }
        set
        {
            if (rules != value)
            {
                rules = value;
                RaisePropertyChanged("Rules");
            }
        }
    }

    public Rule SelectedRule
    {
        get
        {
            return selectedRule;
        }
        set
        {
            if (selectedRule != value)
            {
                selectedRule = value;
                RaisePropertyChanged("SelectedRule");
            }
        }
    }
}

そして最後に、Controller次のようになります。

public class RuleController : Controller
{
    private readonly IShellService shellService;
    private readonly RuleListViewModel ruleListViewModel;

    private readonly DelegateCommand addRuleCommand;
    private readonly DelegateCommand deleteRuleCommand;

    [ImportingConstructor]
    public RuleController(IShellService shellService, IEntityService entityService, RuleListViewModel ruleListViewModel)
    {
        this.shellService = shellService;
        this.ruleListViewModel = ruleListViewModel;
    }

    public void Initialize()
    {
        AddWeakEventListener(ruleListViewModel, RuleListViewModelPropertyChanged);
        shellService.RuleListView = ruleListViewModel.View;

        List<Rule> rules = GetRules();
        ruleListViewModel.Rules = new ObservableCollection<Rule>(rules);
    }

    private void RuleListViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "SelectedRule")
        {
            // This never gets called after edit
        }
    }
}

問題が何であるかは本当にわかりませんが、実際にこの動作を体験するには値を変更する必要があるため(セルをクリックするだけで、何も編集しないで問題なく動作します)、SelectedItemバインディングの切断と関係があると思います。バインドされているアイテムの値を変更しますか?!

4

3 に答える 3

6

このスレッドに出くわし、ObservableCollectionを使用している場合は、GetHashCode()をオーバーライドするかどうかを確認してください(私はIEquatableを介して同等性テストを行っていました)。セルに変更を加えるとすぐに、SelectedItemとSelectedIndexへのバインドが解除されます。

MSDNから(https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx):

「オブジェクトがそのハッシュコードに依存するコレクションに含まれている間、可変オブジェクトのハッシュコードが変更されないようにすることができます。」

そしてもちろん、私は編集可能な(つまり可変の)フィールドでハッシュを取得していました...

于 2015-03-18T22:41:45.030 に答える
0

したがって、データモデルを継承するのを忘れたことが原因であることがわかりましたSystem.Waf.Applications.DataModel(おそらく、WPFアプリケーションフレームワークを使用していると言ったはずです)。

PropertyChanged処理されていないイベントと関係があると思います。

于 2013-01-11T12:14:18.383 に答える
0

datagridがBindingroupsを使用しているためだと思います。したがって、セルに入力すると、検証して行を離れるまで、すべてのUIイベントがバイパスされます。

この投稿を読むと役立つ場合があります:変更されたセルでのWPFDataGridソースの更新

于 2013-01-10T16:44:57.580 に答える