6

私はWPFに非常に慣れておらず、作業するアプリケーションに含めたいいくつかのことをテストしています。ScottGuthrieとJonSkeetという名前の2行のListView(テキストボックスにバインドされています)があります。ListViewで「ScottGuthrie」を選択して、TextBoxに入力しようとしています。テキストを編集してタブをオフにし、ListViewを更新できるようにしたい。

編集:それは実際には質問に何も追加しなかったので、私はコードを削除しました。

4

2 に答える 2

37

うわー、それはあなたがそこに持っているものは本当に複雑です。

これは非常に簡単な方法で実行できます。プログラマーを表すモデル、プログラマーのリストを保持するビューモデル、および残りを処理するための単純なバインディングが必要です。

モデル:

public sealed class Programmer
{
    public string Name { get; set; }
}

その非常に簡単です。名前を持つプログラマーを表すオブジェクト。文字列は.NETでは不変であるため、名前をオブジェクト内にカプセル化する必要があります。文字列のリスト内の単一の文字列に対してバインドしようとした場合、変更は伝播されませんでした。

プログラマーのコレクションはViewModelに保持されます。この場合、私には想像力がないので、それをViewModelと呼びます。このビューモデルには、ビューがバインドするすべてのものが含まれています。この場合、そのプログラマーのリストです。

public sealed class ViewModel
{
    public ObservableCollection<Programmer> Programmers { get; private set; }

    public ViewModel()
    {
        Programmers = new ObservableCollection<Programmer>();
    }
}

ViewModelは、ビューのDataContextとして設定されます。DataContextはビジュアルツリーを流れ、いつでもバインドできます。

public MainWindow()
{
    var vm = new ViewModel();
    vm.Programmers.Add(new Programmer { Name = "Jon Skeet" });
    vm.Programmers.Add(new Programmer { Name = "Scott Guthrie" });
    DataContext = vm;
    InitializeComponent();
}

DataContextは任意の方法で設定できます。簡単にするために、ここでそれを行っています。

UIでは、ListViewをViewModel内のプログラマーのリストに対してバインドするだけです(特に明記されていない限り、DataContextはバインドパスのルートです)。次に、TextBoxをListBoxのSelectedItemに対してバインドします。リストからプログラマーを選択すると、SelectedItemになり、名前を変更できます。

<Window
    x:Class="Programmers.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:t="clr-namespace:Programmers"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <ListBox
            x:Name="list"
            ItemsSource="{Binding Programmers}"
            DisplayMemberPath="Name" />
        <TextBox
            Grid.Column="1"
            VerticalAlignment="Top"
            Text="{Binding SelectedItem.Name, ElementName=list}" />
    </Grid>
</Window>

簡単です。コツをつかめば。

于 2010-12-25T04:37:52.273 に答える
5

これは機能します(任意のテキストを入力できるため、テキストボックスを検証する必要がある場合を除きます。ドロップダウンの方が適している場合があります)。

意見:

<TabItem x:Name="RightTabPage" Header="RightModel"  DataContext="{Binding Right}">
                    <StackPanel>
                        <TextBox Text="{Binding SelectedGuru}"/>
                        <ListView SelectedItem="{Binding SelectedGuru}" ItemsSource="{Binding Gurus}"/>
                    </StackPanel>
                </TabItem>

ViewModel:

public class RightViewModel
    {
        public RightViewModel()
        {
            Gurus = new[] {"Scott Guthrie", "Jon Skeet"};
            SelectedGuru = Gurus.First();
        }

        public string SelectedGuru { get; set; }
        public IEnumerable<string> Gurus{ get; set; }
    }
于 2010-12-25T04:31:16.033 に答える