2014-04-25 3 views
9

मैं एक फ़ील्ड में चेकबॉक्स को बांधने की कोशिश कर रहा हूं लेकिन चेकबॉक्स के इसलेक्टेड को भी ट्रिगर करता हूं।सी # डब्ल्यूपीएफ लिस्टबॉक्स चेकबॉक्स बाइंडिंग एक फ़ील्ड के लिए जांच की जाती है और चयन किया जाता है?

यहाँ ListBox सेटअप है कि डेटा

<ListBox x:Name="lstExclude" Grid.Column="2" SelectionMode="Single" > 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Text}" 
      IsChecked="{Binding Checked ,Mode=TwoWay}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

और यहाँ के लिए बाइंडिंग के साथ काम कर रहा है बाध्यकारी

public MainWindow() 
{ 
    InitializeComponent(); 

    List<CheckBoxListItem> items1 = new List<CheckBoxListItem>(); 
    items1.Add(new CheckBoxListItem(true, “home”)); 
    items1.Add(new CheckBoxListItem(false, “work”)); 
    items1.Add(new CheckBoxListItem(true, “cell”)); 
    lstExclude.ItemsSource = items1; 
} 

public class CheckBoxListItem 
{ 
    public bool Checked { get; set; } 
    public string Text { get; set; } 

    public CheckBoxListItem(bool ch, string text) 
    { 
    Checked = ch; 
    Text = text; 
    } 
} 

इस के साथ जुड़े कोड है सही ढंग से चेकबॉक्स चेक मूल्य बांधता है, लेकिन अगर मैं चेकबॉक्स (चेक या अनचेक) पर क्लिक करता हूं, मैं इसे आइटम का चयन करना चाहता हूं, इसलिए मैंने इसे इस तरह से करने का प्रयास किया

<ListBox x:Name="lstExclude" Grid.Column="2" SelectionMode="Single" > 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Text}" 
      IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

तो यह मुझे चेकबॉक्स (चेक या अनचेक) पर क्लिक करने के परिणाम देता है और यह आइटम का चयन करेगा। समस्या यह है कि जब मैं आइटम जोड़ता हूं तो चेक किए गए फ़ील्ड को बाध्य नहीं किया जाता है।

चेकबॉक्स को बाध्य करने के लिए आप चेकबॉक्स कैसे प्राप्त कर सकते हैं और अभी भी चयन किया गया कार्य है?

+0

आप एक मल्टीबिंग और मल्टीवैल्यू कनवर्टर –

उत्तर

3

ठीक लागू एक YourMultiBindConverter बना सकते हैं, मैं अपने ही सवाल का जवाब दे (और वहाँ बेहतर यह ऐसा करने के लिए हो सकता है पेड़ को जोड़ने के लिए महसूस करें) मैंने चेकबॉक्स में एक क्लिक इवेंट जोड़ा है जैसे

<ListBox x:Name="lstExclude" Grid.Column="2" SelectionMode="Single" > 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Text}" 
      IsChecked="{Binding Checked ,Mode=TwoWay}" Click="CheckBox_Click"/> 
     </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

और उसके बाद क्लिक करें घटना

private void CheckBox_Click(object sender, RoutedEventArgs e) 
{ 
    var cb = sender as CheckBox; 
    var item = cb.DataContext; 
    lstExclude.SelectedItem = item; 
} 

अब आइटम जब आप चेकबॉक्स (जाँच या अनियंत्रित) पर क्लिक करें चयनित हो जाता के लिए इस कोड को जोड़ा गया है और आइटम 'lstExclude.SelectedIndex' विधि के लिए उपलब्ध है

मुझे आशा है कि इससे किसी भी समस्या के साथ आने में मदद मिलेगी।

14

क्या यह दोनों यूआई गुणों को Checked ऑब्जेक्ट मॉडल प्रॉपर्टी से बांधने के लिए काम करेगा?

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="IsSelected" Value="{Binding Checked, Mode=OneWay}"/> 
    </Style> 
</ListBox.ItemContainerStyle> 

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Text}" IsChecked="{Binding Checked}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

बहुत बढ़िया उपयोग कर सकते हैं! यह पूरी तरह से काम करता है। धन्यवाद और त्वरित प्रतिक्रिया के लिए धन्यवाद। – user3573191

+0

असल में, एक समस्या है (और यह मेरे प्रश्न के मेरे शब्द के कारण है) - मैं चाहता हूं कि जब भी आप चेकबॉक्स पर क्लिक करते हैं तो आइटम को चुना जाना चाहिए (भले ही यह चेक किया गया हो या नहीं) - क्षमा करें। कोई विचार? धन्यवाद। – user3573191

+0

@ user3573191 अतीत में मैंने 'DataTrigger' का उपयोग किया है जो' IsSelected = "True" सेट करता है जब भी 'IsKeyboardFocusWithin' सत्य के बराबर है। वाक्यविन्यास कुछ ऐसा लगता है [यह] (http://stackoverflow.com/a/8680879/302677)। क्या यही मतलब है तुम्हारा? – Rachel

2

आप एक MultiBinding साथ MultiConverter

<CheckBox.IsChecked> 
<MultiBinding Converter="{StaticResource YourMultiBindConverter}"> 
       <Binding Path="IsSelected" RelativeSource={RelativeSource AncestorType=ListBoxItem}"/> 
       <Binding Path="Checked"/> 
</MultiBinding> 
</CheckBox.IsChecked> 

का उपयोग करें और है कि IMultiValueConverter

+0

असल में, एक समस्या है (और यह मेरे प्रश्न के मेरे शब्द के कारण है) - मैं चाहता हूं कि जब भी आप चेकबॉक्स पर क्लिक करते हैं तो आइटम को चुना जाना चाहिए (भले ही यह चेक किया गया हो या नहीं) मैंने प्रश्न अपडेट किया - क्षमा करें। कोई विचार? धन्यवाद। – user3573191

+0

इससे वास्तव में मुझे बहुत मदद मिली क्योंकि मुझे अपने मॉडल में एक विशिष्ट मूल्य, लेकिन मूल्यों की एक सूची से जुड़ने की आवश्यकता नहीं थी। मेरा ग्राहक चाहता था कि सूची बॉक्स चेक के साथ-साथ हाइलाइट्स दिखाए, और इससे मुझे वहां पहुंचने में मदद मिली। धन्यवाद। – Tronald

1
<CheckBox Padding="10" 
      IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
               ListBoxItem}}, Path=IsSelected}"> 
     <CheckBox.LayoutTransform> 
        <ScaleTransform ScaleX="1" ScaleY="1" /> 
     </CheckBox.LayoutTransform> 
    </CheckBox> 
संबंधित मुद्दे