9

私はWPFアプリケーションに取り組んでおり、MVVMに従っています。私の見解では、異なる列を含むグリッド ビューがあります。これらの列の 1 つは ListBox です。ここでの問題は、ListBox 列の場合、SelectedItem の get は正常に機能しますが、set は機能しないということです。

ここに私のビューコードがあります

<DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" SelectionMode="Single">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" Header="Name" />
        <DataGridTemplateColumn Header="Actions">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Actions}" SelectedItem="{Binding SelectedAction}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

私のViewModelには、アイテムのリストを含むMain ViewModelクラスがあります。Item クラスには、名前、アクションのリスト、および選択されたアクションが含まれます。

public class MyViewModel : INotifyOfPropertyChanged
{
    private ObservableCollection<Item> _items;
    public ObservableCollection<Item> Items
    {
        get { return _items?? (_items= new ObservableCollection<Item>); }
    }

    private Item _selectedItem;
    public Item SelectedItem
    {
        get { return _selectedItem; }
        set { _selectedItem= value; }
    }
}

public class Item : INotifyOfPropertyChanged
{
    public string Name;

    private ObservableCollection<string> _actions;
    public ObservableCollection<string> Actions
    {
        get { return _actions?? (_actions= new ObservableCollection<string>); }
    }

    private string _selectedAction;
    public string SelectedAction
    {
        get { return _selectedAction; }
        set { _selectedAction = value; }
    }
}

アイテム リストの SelectedItem が正常に機能するようになりました。ただし、Actions の Item クラス内の SelectedItem は完全には機能しません。SelectedAction の getter と setter にブレークポイントを挿入しました。ブレークポイント ヒットを取得します。しかし、UI からアクションを選択すると、SelectedAction のブレークポイントを設定してもヒットしません。

どうしたの。

意見

Archive Project または Restore Project を選択すると、SelectedAction のセッターが呼び出されません。

注:リストへのデータのロード、INotifyOfPropertyChanged の実装などの不要な情報を削除しました。

4

7 に答える 7

4

SelectedItem で TwoWay-Binding を指定する必要があります。そうしないと、UI で行われた変更がビューモデルに渡されません。

SelectedItem="{Binding SelectedAction, Mode=TwoWay}"
于 2013-05-14T08:03:56.610 に答える
3

これが修正です。selectedItem のリストボックスに UpdateSourceTrigger を設定する必要があります。

<DataTemplate>
   <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Actions}" SelectedItem="{Binding SelectedAction, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
于 2016-05-27T07:06:56.330 に答える
2

MyViewModel クラスの SelectedItem プロパティは、セッターがその値を変更したときに PropertyChanged イベントを発生させることによって INotifyPropertyChanged インターフェイスを使用しません。

public Item SelectedItem
{
    get { return _selectedItem; }
    set 
    {
        if(value != _selectedItem)
        {
            _selectedItem= value; 
            OnPropertyChanged("SelectedItem");
        }
    }
}

すべての ViewModel のすべてのプロパティに対してこれを行う必要があります。

于 2013-05-14T07:54:58.907 に答える
0

私が正しい方向に進んでいるかどうかはわかりませんが、文字列をクラスでラップしようとしましたか?

public class Item : INotifyOfPropertyChanged
{
public string Name;

private ObservableCollection<MyActionString> _actions;
public ObservableCollection<MyActionString> Actions
{
    get { return _actions?? (_actions= new ObservableCollection<MyActionString>); }
}

private MyActionString _selectedAction;
public MyActionString SelectedAction
{
    get { return _selectedAction; }
    set { _selectedAction = value; }
}
}
于 2013-05-14T08:11:44.453 に答える