0

ユーザーが編集できるコンボボックスがあるので、Text プロパティをクラスのプロパティにバインドしました。その同じコンボボックスの ItemsSource は AsyncObservableCollection にバインドされています (これは他の投稿に基づいて行ったもので、うまく機能します)。

ただし、ItemsSource の更新時に問題が発生します。

再現する手順は次のとおりです。

  1. コンボボックスのドロップダウンで値を選択します。
  2. コンボボックスにテキストを入力します。(「あぁ」と言って)
  3. ItemsSource を更新します。(私のボタンをクリックして)

結果: MyText プロパティは入力したテキスト ("aaa") に設定されたままになりますが、コンボ ボックスには空白のエントリが表示されます。

ただし、上記と同じ手順を実行して手順 1 を省略した場合、コンボ ボックスには MyText プロパティのテキストが正しく表示されます。これにより、ItemsSource の更新が完了した後、選択されたインデックス/選択された値がコンボボックスの更新に使用されていると思われます。

ItemsSource の更新後に、表示された値を MyText プロパティと同期させる方法についてのアイデアはありますか?

以下に示すコードでは、再現するためにボタンのクリックで ItemsSource を更新しています。

ありがとう!

XAML:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="200" IsEditable="True"
                          DataContext="{Binding Path=MyDataClass}"
                          ItemsSource="{Binding Path=MyListOptions}"
                          SelectedIndex="{Binding Path=MySelectedIndex}"
                          Text="{Binding Path=MyText, UpdateSourceTrigger=LostFocus}"
              >
    </ComboBox>
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="416,276,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>

コードビハインド:

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Diagnostics;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public class DataClass : INotifyPropertyChanged
        {
            private string mytext = "";
            public string MyText
            {
                get
                {
                    return mytext;
                }
                set
                {
                    mytext = value;
                    OnPropertyChanged("MyText");
                }
            }

            private int myselectedindex = -1;
            public int MySelectedIndex 
            {
                get
                {
                    return myselectedindex;
                }

                set
                {
                    if (value != -1)
                    {
                        mytext = MyListOptions[value];
                        OnPropertyChanged("MyText");
                    }
                }
            }

            private AsyncObservableCollection<string> mylistOptions = new AsyncObservableCollection<string>();
            public AsyncObservableCollection<string> MyListOptions
            {
                get
                {
                    return mylistOptions;
                }

                set
                {
                    mylistOptions.Clear();
                    OnPropertyChanged("MyListOptions");
                    foreach (string opt in value)
                    {
                        mylistOptions.Add(opt);
                    }
                    OnPropertyChanged("MyListOptions");
                }
            }

            public DataClass()
            {
            }

            public event PropertyChangedEventHandler PropertyChanged;

            internal void OnPropertyChanged(string prop)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }

        public DataClass MyDataClass { get; set; }

        public MainWindow()
        {
            MyDataClass = new DataClass();

            MyDataClass.MyListOptions.Add("Option 1 - Provides helpful stuff.");
            MyDataClass.MyListOptions.Add("Option 2 - Provides more helpful stuff.");
            MyDataClass.MyListOptions.Add("Option 3 - Provides extra helpful stuff.");

            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            AsyncObservableCollection<string> newList = new AsyncObservableCollection<string>();
            newList.Add("Option A - Provides helpful stuff.");
            newList.Add("Option B - Provides more helpful stuff.");
            newList.Add("Option C - Provides extra helpful stuff.");

            MyDataClass.MyListOptions = newList;

        }
    }
}
4

1 に答える 1

0

OK、SelectedValue を Text と同じプロパティにバインドし、そのモードを OneWay に設定することで、この問題を解決しました。

    <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="200" IsEditable="True"
                          DataContext="{Binding Path=MyDataClass}"
                          ItemsSource="{Binding Path=MyListOptions}"
                          SelectedIndex="{Binding Path=MySelectedIndex}"
                          SelectedValue="{Binding Path=MyText, Mode=OneWay}"
                          Text="{Binding Path=MyText, UpdateSourceTrigger=LostFocus}"
于 2012-10-16T20:22:49.857 に答える