2016-08-11 94 views

回答

0

是的,這是可能的。我已經做了類似的ListView,這本質上是相同的控制。這裏的訣竅是使其成爲FAST。如果你有成千上萬的物品,它不應該花費30秒。

現在,你如何實現它取決於你是否想要構建一個通用控件或專門爲此對象類型創建的控件。原因在於要做到這一點,你需要知道項目對象的哪個屬性是IsChecked。在我的控制下,我創建了一個名爲IsCheckedPath的DP,因此它本着WPF的精神。然後控件會自動將每個對象的IsCheckedPath屬性綁定到相應的複選框。

當主複選框被切換時,您需要遍歷項目並設置屬性值。您有2個選擇:1)反射或2)在設置IsCheckedPath DP時編譯表達式樹。

我做了#2,因爲反射會太慢。

如果你只關心這個特定的對象,並不認爲你會重複使用該控件,那麼你可以跳過這兩個,只需設置屬性。不是一個好主意IMO,我會去通用路線:)。

此外,請注意,您不能採用「快捷方式」並通過視覺效果循環,並從另一側設置複選框,因爲WPF控制虛擬化並且複選框對於滾動出來的項目不會「活動」視圖。

0

你好,歡迎來到WPF!對於這種情況,它看起來像一個MultiBinding是你正在尋找。由於主複選框可以更改單個複選框,反之亦然,所以綁定應該是雙向的。該MultiBinding將被應用到主複選框,這樣的:

<Checkbox x:Name="MasterCheckBox"> 
<Checkbox.IsChecked> 
    <MultiBinding Converter="[Instance of your converter class]" Mode="TwoWay"> 
     <Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Mobile}"/> 
     <Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Skype}"/> 
     <Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Landline}"/> 
    </MultiBinding> 
</Checkbox.IsChecked> 

您需要還可以創建一個轉換器。上面鏈接的文章描述瞭如何製作一個簡單的轉換器。在你的情況下,因爲綁定是雙向的,所以你需要處理Convert和ConvertBack方法。當主複選框被用戶更改時,ConvertBack方法會運行,因此它必須將多重綁定下的所有綁定設置爲true或false。當一個單獨的複選框發生變化時,Convert方法會運行。在這種情況下,在WPF中,如果所有單個框被選中,則將主複選框的IsChecked設置爲true;如果未選中所有單獨框,則設置爲false;如果混合,則IsChecked應該爲null。 IsChecked可以爲null,因爲該屬性的類型是bool? (可爲空的布爾值),這是WPF中三態複選框的工作原理。

+0

這並沒有解決我的問題,我已經縮小到IValueConverter,但我不知道如何解決它,我現在將添加IValueConverter。 –