1

WPFMVVMおよびを使用してDevExpress GridControlいます。MainWindow.xaml には 2 つのパネルがあります。Panle1 には Grid があり、Panel2 には がありTextboxます。Panel1 の Grid からアイテムを選択すると、その名前がその Panle2 Textbox に表示されます。コードを書きましたが、機能していません。これを解決するのを手伝ってもらえますか?

*Models フォルダの NameModel に次のように書きました: *

private NameModelClass _selectedCustomer;
public NameModelClass SelectedCustomer
{
    get { return _selectedCustomer; }
    set
    {
        if (_selectedCustomer != value)
        {
            _selectedCustomer = value;
            LastName = value.LastName;
            OnPropertyChanged("SelectedCustomer");
        }
     }

    public List<Namess> ListPerson { get; set; }

    void CreateList()
    {
        ListPerson = new List<Namess>();
        for (int i = 0; i < 10; i++)
        {
            ListPerson.Add(new Namess(i));
        }
    }

    public class Namess
    {
        public Namess(int i)
        {
            FirstName = "FirstName" + i;
            LastName = "LastName" + i;
            Age = i * 10;
        }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
}

MianWindow.xaml に次のように書きました。

<dxdo:LayoutPanel Caption="Grid" Caption="Panel1" x:Name="abc1">
    <Grid>
        <dxg:GridControl x:Name="grid" Height="233" ItemsSource="{Binding ListPerson}" AutoGenerateColumns="AddNew" HorizontalAlignment="Left" VerticalAlignment="Top"   SelectedItem="{Binding SelectedNames}">
            <dxg:GridControl.View>
                <dxg:TableView ShowTotalSummary="True"/>
            </dxg:GridControl.View>
        </dxg:GridControl>
    </Grid>
</dxdo:LayoutPanel>

<dxdo:LayoutPanel Caption="Panel2" x:Name="abc1">
    <TextBox Width="166" Background="White" Height="33"  HorizontalAlignment="Right"  VerticalAlignment="Bottom"  Text="{Binding Path=LastName}"/>
</dxdo:LayoutPanel>

私はMVVMC#が初めてです。私の質問が明確でない場合は、私に尋ねてください。ありがとうございました。

4

3 に答える 3

1

私はこのようにします:

private Namess _selectedCustomer;
public Namess SelectedCustomer
{
    get { return _selectedCustomer; }
    set
    {
        if (_selectedCustomer != value)
        {
            _selectedCustomer = value;
            OnPropertyChanged("SelectedCustomer");
        }
     }

    public List<Namess> ListPerson { get; set; }

    void CreateList()
    {
        ListPerson = new List<Namess>();
        for (int i = 0; i < 10; i++)
        {
            ListPerson.Add(new Namess(i));
        }
    }

    public class Namess : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }

        public Namess(int i)
        {
            FirstName = "FirstName" + i;
            LastName = "LastName" + i;
            Age = i * 10;
        }
        public string FirstName { get; set; }
        private string _lastName;
        public string LastName 
        { 
            get
            {
                return _lastName;
            }
            set
            {
                if(value==_lastName)
                    return;
                _lastName=value;
                OnPropertyChanged("LastName");
            }
        }
        public int Age { get; set; }
    }
}

そしてあなたの見解では:

<dxdo:LayoutPanel Caption="Grid" Caption="Panel1" x:Name="abc1">
    <Grid>
        <dxg:GridControl x:Name="grid" Height="233" ItemsSource="{Binding ListPerson}" AutoGenerateColumns="AddNew" HorizontalAlignment="Left" VerticalAlignment="Top" SelectedItem="{Binding SelectedNames,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
            <dxg:GridControl.View>
                <dxg:TableView ShowTotalSummary="True"/>
            </dxg:GridControl.View>
        </dxg:GridControl>
    </Grid>
</dxdo:LayoutPanel>

<dxdo:LayoutPanel Caption="Panel2" x:Name="abc1">
    <TextBox Width="166" Background="White" Height="33"  HorizontalAlignment="Right" VerticalAlignment="Bottom"  Text="{Binding Path=SelectedCustomer.LastName,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/>
</dxdo:LayoutPanel>

基本的に、SelectedCustomer のタイプをアイテムのコレクションの 1 つに変更しました。ビューでは、TextBox のバインドを SelectedCustomer のプロパティに直接設定できます。

于 2013-08-26T21:33:55.730 に答える
0

「LastName」文字列の INPC (INotifyPropertyChanged) イベントを発生させるのを忘れたようです。

これを試してください(変更は以下のセッターにあります):

public NameModelClass SelectedCustomer
    {
    get { return _selectedCustomer; }
    set
        {
        if (_selectedCustomer != value)
            {
            _selectedCustomer = value;
            LastName = value.LastName;
            OnPropertyChanged("SelectedCustomer");
            OnPropertyChanged("LastName");   //<-- new 
            }
        }
    }

バインディングが新しい値に更新することを認識できるように、INPC を送信する必要があります。表示されたバインディングは、そのイベントを発生させない限り、LastName の新しい値を「取得」しません。

于 2013-08-26T19:03:13.740 に答える
0

やってみました:

SelectedItem="{Binding SelectedNames, Mode=TwoWay}"

さらに詳しく調べた後、メインの Namess クラスは INotifyPropertyChanged を実装することで行うことができます

各プロパティを使用すると、プロパティが変更されたときにプロパティ変更イベントが発生します

また、監視可能なコレクションを使用しているため、アイテムを追加および削除すると、変更も発生します。

このようにして、通知変更システムはプロパティ変更の通知を受け取り、それに応じてバインディングを介してビューを変更します。

于 2013-08-26T19:02:57.870 に答える