4

私は現在Entity、コレクション プロパティを持つ を持っています。以前に選択した項目を選択しようとするSelectionChangedと、なぜ一度だけ発火し、再び発火しないのかを知りたいです。SelectionChanged

MainWindowViewModel

  public MainWindowViewModel()
    {
        var a = new List<Test>();

        a.Add(new Test() { Name = "Leo", Test1 = new List<Test1> { new Test1() { Content = "aaa"} } });
        a.Add(new Test() { Name = "2", Test1 = new List<Test1> { new Test1() { Content = "bbb"} } });
        a.Add(new Test() { Name = "Le33o", Test1 = new List<Test1> { new Test1() { Content = "ccc"} } });
        A = a;
    }

    private List<Test> _a;
    public List<Test> A
    {
        get { return _a; }
        set { _a = value; OnPropertyChanged("A");}
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

私のメインウィンドウ

public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindowViewModel();
        }
        private void Test(object sender, SelectionChangedEventArgs e)
        {
        }

私のリストボックス構造

public class Test
{
    public List<Test1> Test1 { get; set; }
    public string Name
    {
        get;set;
    }
}

public class Test1
{
    public string Content { get; set; }
}

最初のオブジェクトを選択するとイベントが発生し、2 番目のオブジェクトを選択するとイベントが発生し、最初のオブジェクトを選択してもイベントは発生せず、3 番目のオブジェクトを選択するとイベントが発生します。イベントを1回だけトリガーして呼び出すようです。

私のXAMLコード:

<ItemsControl x:Name="Lists" ItemsSource="{Binding A}" Grid.Row="1">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}" FontWeight="Bold" 
                                                        Style="{StaticResource DefaultTextBlockStyle}" />

                    <ListBox  SelectionChanged="Test"  ItemsSource="{Binding Test1}"
                                 Margin="5,0,0,0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding Content}" />
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

テストメソッドは、変更するたびにブレークポイントにヒットしたいだけの空のメソッドです。

  private void Test(object sender, SelectionChangedEventArgs e)
    {
    }

更新 1 :単純な WPF アプリでこれを再現しようとしました。ListBoxItem が IsEnabled を false に設定しているようですが、スヌープしてすべてのコントロールが有効になっているようです。無効のように見える灰色の背景を取得するだけです。さらに調査を試みます。

更新 2 : 項目を変更したときに ListBoxItem IsSelected プロパティが設定解除されていないようです。

4

3 に答える 3

6

あなたの質問に答えるには...

以前に選択した項目を選択しようとすると、SelectionChanged が 1 回だけ起動し、SelectionChanged が再度トリガーされない理由を知りたいです。

... やり方で学ぶ

新しい WPF プロジェクトを開く 2 つのリストボックスを追加する 両方に対して 1 つの SelectionChanged イベントを作成し、各リストボックスにいくつかの項目を追加する

それが今このように見えることに言及しましょう

    <ListBox Height="100" Name="listBox1" Width="120" SelectionChanged="listBox_SelectionChanged"/>
    <ListBox Height="100" Name="listBox2" Width="120" SelectionChanged="listBox_SelectionChanged"/>

.

        var list = new List<string>();
        list.Add("Element1");
        list.Add("Element2");
        list.Add("Element3");
        list.Add("Element4");

        listBox1.ItemsSource = list;
        listBox2.ItemsSource = list;

その後、get トリガーを選択した場合は、再度get トリガーを選択Element1listBox1ます。listBox_SelectionChangedElement2listBox2listBox_SelectionChanged

あなたをよく見ると、あなたの後ろが灰色であることがわかります。これは、選択されていることを意味しますが、焦点がlistBox1合っていません. ここでもう一度選択する と、Focuse だけが変更されるため、選択は変更されないため、トリガーは取得されません。BackgroundElement1Element1listBox1listBox_SelectionChanged

DataTemplate2 つのリストボックスを自動的に追加したときと同じように考えているため、コードにはまったく同じ「問題」があります。

次のコードを使用できるシンプルで汚れた回避策として

    private object seletedItem;
    private ListBox ItemsHost;

    private void Test(object sender, SelectionChangedEventArgs e)
    {
        var buff = sender as ListBox;

        if (seletedItem != null)
            if (ItemsHost != buff)
                ItemsHost.SelectedItem = null;

        ItemsHost = buff;

        if (e.AddedItems.Count > 0)
            seletedItem = e.AddedItems[0];
    }
于 2013-06-20T07:36:16.067 に答える
-4

同じアイテムを選択することは、SelectionChangedイベントではありません。選択は変更されませんでした。

問題の説明は明確ではありません。

それを分解します。これは私のために働きます。2回目、3回目、4回目のアイテムを選択すると、イベントが発生します。

OPは、リスト内のリストの場合は機能しないと主張しました。まだ私のために働きます。

    public MainWindow()
        {
            this.DataContext = this;
            InitializeComponent();
        }

        public List<ListList> ListList1 
        {
            get { return new List<ListList>{new ListList("name1", new List<string> { "one", "two", "three" })}; } 
        }

        private void Test(object sender, SelectionChangedEventArgs e)
        {
            ListBox lb = (ListBox)sender;
            System.Diagnostics.Debug.WriteLine(lb.SelectedItem.ToString());
        }

        public class ListList
        {
            public string Name { get;  set; }
            public List<string> Values { get;  set; }
            public ListList(string name, List<string> values) { Name = name; Values = values; }
        }

<ListBox ItemsSource="{Binding Path=ListList1}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <ListBox  SelectionChanged="Test" ItemsSource="{Binding Path=Values}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" />
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
于 2012-05-28T16:28:14.347 に答える