2012-03-28 13 views
6

की आईस्कैक्ड संपत्ति में डेटा ट्रिगर को बाइंड करना मुझे विश्वास है कि मैं जो करने की कोशिश कर रहा हूं वह "सरल" है, इसलिए शायद मुझे कुछ स्पष्ट याद आ रही है।एक चेकबॉक्स

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

मैंने this question पढ़ा है, लेकिन जहां मेरा जवाब नहीं है, वही है जो वास्तव में "बूलियनप्रोपर्टीऑनऑब्जेक्टबाउंडट्रो" के रूप में रखना है। मैंने this question पर भी देखा है और एक सापेक्ष स्रोत के साथ गड़बड़ करने की कोशिश की लेकिन बिना किसी किस्मत के।

मैं अपने ग्रिड बनाने के मेरे में कोड-पीछे, लेकिन यहाँ मेरे वर्तमान पंक्तियों के लिए इस्तेमाल किया शैली (जो मेरे DataTrigger परिभाषित किया गया है) है:

<Style x:Key="MyRowStyle" TargetType="DataGridRow"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
       <Setter Property="Background" Value="Blue"/> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

अब मेरी कोड-पीछे में, मैं अपने DataGridTemplateColumn बना सकते हैं और एक फैक्टरी का उपयोग अपने चेक बॉक्स बनाने के लिए, और यहाँ मेरी बाइंडिंग प्रासंगिक कोड है:

Binding checkBinding = new Binding("IsChecked"); 
checkBinding.Mode = BindingMode.OneWayToSource; 
RelativeSource relativeSource = new RelativeSource(); 
relativeSource.AncestorType = typeof(DataGridRow); 
relativeSource.Mode = RelativeSourceMode.FindAncestor; 
checkBinding.RelativeSource = relativeSource; 
factory.SetBinding(CheckBox.IsCheckedProperty, checkBinding); 

क्या रुचि का हो सकता तथ्य मैं एक DataTable करने के लिए अपने डेटा ग्रिड के ItemsSource सेट है कि, लेकिन मेरे चेकबॉक्स स्तंभ नहीं करता है डेटाटेबल में एक समान कॉलम है। मैं बस टेम्पलेट कॉलम को अलग से जोड़ता हूं, शायद अंतर्निहित भंडारण की कमी इस पर असर डाल रही है?

किसी भी मामले में यदि आपको कोई और जानकारी चाहिए, तो कृपया मुझे बताएं। धन्यवाद!

+0

बिल्कुल मेरी का उत्तर मिला? – Phil

उत्तर

2

यहां एक उदाहरण है जो सी # कक्षाओं का उपयोग करके मेरे लिए काम करता है, डेटासेट नहीं।

Xaml

<Page.Resources> 
    <Style x:Key="RowStyle" TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
       <Setter Property="Background" Value="Blue"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Page.Resources> 

<Page.DataContext> 
    <Samples:DataGridRowHighlightViewModels/> 
</Page.DataContext> 

<Grid> 
    <DataGrid ItemsSource="{Binding Items}" RowStyle="{StaticResource RowStyle}" CanUserAddRows="False" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Header="Selected" Binding="{Binding IsChecked}"/> 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

सी #

public class DataGridRowHighlightViewModels 
{ 
    public DataGridRowHighlightViewModels() 
    { 
     Items = new List<DataGridRowHighlightViewModel> 
        { 
         new DataGridRowHighlightViewModel {Name = "one"}, 
         new DataGridRowHighlightViewModel {Name = "two"}, 
         new DataGridRowHighlightViewModel {Name = "three"}, 
         new DataGridRowHighlightViewModel {Name = "four"}, 
        }; 
    } 
    public IEnumerable<DataGridRowHighlightViewModel> Items { get; set; } 
} 

// ViewModelBase and Set() give INotifyPropertyChanged support (from MVVM Light) 
public class DataGridRowHighlightViewModel : ViewModelBase 
{ 
    private bool _isChecked; 
    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set { Set(()=>IsChecked, ref _isChecked, value); } 
    } 

    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set { Set(()=>Name, ref _name, value); } 
    } 
} 
+1

उत्तर के लिए धन्यवाद, हालांकि मेरे पास डेटासेट का उपयोग करने में कोई विकल्प नहीं है, आपकी पोस्ट ने मुझे क्या बताया है कि मुझे इस बुलियन मूल्य को पकड़ने के लिए अंतर्निहित भंडारण के कुछ रूप की आवश्यकता है, इसलिए मैंने जो किया वह एक बुलियन था मेरे डेटाटेबल को कॉलम गतिशील रूप से कॉल करें और मेरे चेकबॉक्स और डेटा ट्रिगर को उस पर बाध्य करें, और voila! –

संबंधित मुद्दे