1

以前の長い投稿でごめんなさい。これが私の簡潔な(!)説明です。

コレクションビューをitemsSourceとしてコンボボックスにバインドし、そのselectedvalueをビューモデルのプロパティにバインドします。IsSynchronizedWithCurrentItem="False"を保持する必要があります。

ビューのソースリストを変更してから、ビューを更新します。変更された(追加、削除、編集された)アイテムは、コンボのアイテムリストに正しく表示されます。しかし、問題は選択したアイテムにあります。コンボのdisplaymemberパスでもあるプロパティを変更すると、変更されたプロパティ値がコンボの選択ボックスに反映されません。コンボドロップダウンを開くと、アイテムリストには正しく表示されますが、選択ボックスには表示されません。

XAMLでコンボボックスタグをリストボックスに変更すると(すべての属性はそのまま)、選択したアイテムのdisplaymemberプロパティ値が更新されると、変更はリストボックスの選択したアイテムに反映されます。

なぜこの問題ですか?

参考までに:

  1. 私のビューモデルには、ItemsSourceおよびSelectedValuerespとしてコンボにバインドされたプロパティEmployeeCollectionViewおよびSelectedEmployeeIdがあります。このVMは、INotifyPropertyChangedインターフェイスを実装します。

  2. 私のコア従業員クラス(そのリストはEmployeeCollectionViewのソースです)は、INotifyPropertyChangedのない単なるModelクラスです。

  3. DisplayMemberPathは、employeeModelクラスの「Name」プロパティです。私はこれを何らかの方法で変更し、コンボ選択ボックスが値を更新することを期待しています。

  4. SelectedEmployeeIdを0(itemsSourceからダミーの「-Select All-」従業員エントリを正しく選択する場所)に設定し、古い選択値を元に戻して更新してみました。しかし、役に立たない。古い値は私を古いラベルに戻します。ただし、アイテムコレクションには最新のエントリがあります。

  5. ビューを更新する前にコンボボックスのIsEditable=Trueを作成し、更新後にIsEditable = Falseを作成すると、正常に動作します。

ただし、これはパッチであり、不要です。

どうも

Vinit Sankhe

4

1 に答える 1

0

あなたのポイント#2と#3が、これが機能しない理由です。ComboBox で項目が選択されると、ボックスに Employee.Name プロパティが表示されます。#2 では Employee が INotifyPropertyChanged を実装していないと述べ、#3 では Name を変更し、ComboBox で更新されることを期待しています。ただし、ComboBox はプロパティが変更されたことを認識しないため、表示される値は変更されません。

実証する非常に簡単な例をまとめました。PropertyChanged イベントをコメント アウトすると、ボタンをクリックしても UI に影響がなくなることがわかります。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        SizeToContent="WidthAndHeight">
    <StackPanel>
        <ComboBox ItemsSource="{Binding}" DisplayMemberPath="Name" SelectedIndex="0" Width="150" Height="25" />
        <Button Content="Change" Width="75" Height="25" Click="button_Click"/>
    </StackPanel>
</Window>

そして背後にあるコード...

public partial class MainWindow : Window
{

    private ObservableCollection<Thing> things;
    private Queue<string> words;

    public MainWindow()
    {

        // some dummy data
        string text = "Lorem ipsum dolor sit amet consetetur sadipscing elitr sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat sed diam voluptua";
        words = new Queue<string>(text.Split(' '));

        things = new ObservableCollection<Thing>();
        things.Add(new Thing { Name = words.Dequeue() });
        things.Add(new Thing { Name = words.Dequeue() });
        things.Add(new Thing { Name = words.Dequeue() });

        DataContext = things;

        InitializeComponent();

    }

    private void button_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        things[0].Name = words.Dequeue();
    }

}
于 2010-04-29T04:03:09.610 に答える