2009-11-24 29 views
4

好的,這必須是一個重複的問題,但我找不到答案: 我有一個列表框,是一個集合的數據綁定。默認情況下,選擇項目[0]。我怎樣才能防止這種情況,以確保在我單擊ListBoxItem時發生SelectionChanged事件?如何確保在數據綁定ListBox中沒有選中項目?

編輯: 我已經駁回的SelectedIndex = -1路線,但我再次嘗試:在列表框的構造函數(或在XAML屬性)不起作用的SelectedIndex設置爲-1。看起來,在初始化之後,列表框被填充並且selectedindex將變爲0。將SelectedItem設置爲null的所謂故事;

我嘗試這樣做:

<ListBox ItemsSource="{Binding Value}" 
     SelectionChanged="ListBox_SelectionChanged" 
     IsSynchronizedWithCurrentItem="True" 
     Loaded="ListBox_Loaded"> 
</ListBox> 

有:

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if(e.AddedItems.Count==0)return;//Prevents stackoverflow! ;-) 
     ((ListBox)e.OriginalSource).SelectedItem=null; 
    } 

private void ListBox_Loaded(object sender, RoutedEventArgs e) 
{ 
    ((ListBox) sender).SelectedItem = null; 
} 

這工作,但它插入在該列表框顯示,這是非常醜陋的項目頂部的空白行... 在我的特殊情況下,我可以通過刪除IsSynchronizedWithCurrentItem屬性來解決問題。

但我可以想到很多情況下,這是不可接受的。

上面的語句是無稽之談:要麼使用master-detail綁定並將IsSynchronizedWithCurrentItem設置爲true,要麼不要。這是不太可能的,你想利用主從細節綁定,然後沒有當前選定的項目在你的列表框

回答

2

使用CollectionView作爲您的列表框的ItemsSource。新鮮的WPF項目,沒有項目最初選擇:

XAML:

<Window x:Class="ListBoxDataBinding.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <ListBox 
     ItemsSource="{Binding Path=Value, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" 
     SelectionChanged="ListBox_SelectionChanged" 
     IsSynchronizedWithCurrentItem="True" 
     > 
    </ListBox> 
</Grid> 
</Window> 

CS:

public partial class Window1: Window { 
    public IEnumerable Value { 
     get { return (IEnumerable)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(IEnumerable), typeof(Window1), new UIPropertyMetadata(null)); 


    public Window1() { 
     InitializeComponent(); 
     var view = new TheCollectionView(); 
     view.MoveCurrentTo(null); 
     this.Value = view; 
    } 

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
     MessageBox.Show("Selection changed"); 
    } 
} 

public class TheCollectionView: CollectionView { 
    public TheCollectionView(): base(new TheCollection()) { 
    } 
} 

public class TheCollection: List<string> { 
    public TheCollection() { 
     Add("string1"); 
     Add("string2"); 
     Add("string3"); 
    } 
} 
+0

非常好,代碼顯示了一些我不熟悉的方法。謝謝! – Dabblernl 2009-11-29 19:21:18

+0

對不起,關於代碼 - 這只是快速和骯髒的方式來演示解決方案。代碼本身在很多方面都是錯誤的。 – 2009-11-29 23:19:04

1

你需要設置索引爲-1,這告訴列表框不要選擇什麼。在SelectionChanged事件中,將列表框的Index屬性設置爲-1。

希望這會有所幫助, 最好的問候, 湯姆。

2
listbox.selectedIndex = -1 

這應該取消選擇一切(因爲指數-1不存在),但據我所知,除非你明確地設定與沒有產生列表視圖中選擇默認的selectedItem屬性,所以這是可能的SelectedIndex已被無意中設置在某個點上。請注意,SelectedIndex也可以在XAML中設置。

1

如何轉儲SelectionChanged事件處理程序和數據綁定依賴項屬性或將屬性通知給SelectedValue?

+0

那麼這是一個有趣的練習,但它基本上不會改變行爲。此外,在視圖模型的PropertyChangedCallBack中將SelectedValue設置爲null不再有效,似乎無論如何都會選中所單擊的項目。 – Dabblernl 2009-11-27 22:25:40

6

運行一些測試後,ListBox的默認行爲是不預先選擇列表中的一個項目。刪除IsSynchronizedWithCurrentItem =「True」將確保列表框不會開始預選,並且當用戶單擊任何項​​目時將引發SelectionChanged事件。

如果您將IsSynchronizedWithCurrentItem設置爲true,則意味着selectedIndex將始終等於ListBox.Items的ListBox.Items.CurrentItem的索引。 ListBox.Items始終具有CurrentItem,並且由於CurrentItem或CurrentIndex是隻讀的,因此無法將其設置爲-1或null。

希望幫助 Ĵ

編輯...剛剛閱讀

「在我的特殊情況下,我可以通過刪除IsSynchronizedWithCurrentItem屬性來解決問題,但我可以想到很多情況下這是不可接受的。

在這種情況下,我不認爲這是可能的上述原因。

+0

謝謝,在這裏解釋了問題的原因! – Dabblernl 2009-11-29 19:03:43

+0

謝謝!瞭解這一點對於我在我們的應用程序中解決此問題非常重要。 – CuriousKea 2013-09-24 22:23:48

0

您可以使用點擊事件,而不是的SelectionChanged的:

<ListBox ItemsSource="{Binding Data}" Tap="ListBox_Tap" ... /> 
相關問題