डेटा बाइंडिंग का उपयोग करके गुण मान के आधार पर डेटाग्रिड की पंक्ति पृष्ठभूमि कैसे सेट करें


81

मेरे XAML कोड में, मैं Backgroundएक विशिष्ट पंक्ति में ऑब्जेक्ट के मूल्य के आधार पर, प्रत्येक पंक्ति का रंग सेट करना चाहता हूं । मेरे पास एक ObservableCollectionहै z, और प्रत्येक के zपास एक संपत्ति है State। मैंने अपने साथ कुछ इस तरह से शुरुआत की DataGrid:

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Setter Property="Background" 
                Value="{Binding z.StateId, Converter={StaticResource StateIdToColorConverter}}"/>
     </Style>
</DataGrid.RowStyle>

यह एक गलत दृष्टिकोण है क्योंकि x मेरे ViewModel वर्ग की संपत्ति नहीं है।

मेरे ViewModel वर्ग में मेरे पास एक है ObservableCollection<z>जो ItemsSourceइस प्रकार का है DataGrid, और एक SelectedItemप्रकार का है z

मैं करने के लिए रंग बाँध सकता है SelectedItem, लेकिन यह केवल एक पंक्ति में बदल जाएगा DataGrid

मैं, एक संपत्ति के आधार पर इस पंक्तियों को कैसे बदल सकता हूं?

जवाबों:


171

एक का उपयोग करें DataTrigger:

<DataGrid ItemsSource="{Binding YourItemsSource}">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow"> 
            <Style.Triggers>
                <DataTrigger Binding="{Binding State}" Value="State1">
                    <Setter Property="Background" Value="Red"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding State}" Value="State2">
                    <Setter Property="Background" Value="Green"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

2
मुझे केवल यही मिलता है: बाइंडिंगएक्सप्रेशन पाथ एरर: 'State' property not found on 'object' ''z' (HashCode=7162954)'. BindingExpression:Path=State; DataItem='z' (HashCode=7162954); target element is 'DataGridRow' (Name=''); target property is 'NoTarget' (type 'Object')यह कैसे कहें कि यह प्रॉपर्टी स्टेट को नहीं मिल रहा है जब मेरी इकाई इसे रखती है, और मेरा डेटाबेस स्टेट को एक कॉलम के रूप में दिखाता है?
टोबियास मो थोरस्टेंसन

2
मुझे आशा है कि आप ऐसा नहीं कर रहे हैं z.State
नितेश

4
बस फिर से wpf से समय के बाद इस पार आया, काश मैं फिर से upvote कर सकता!
रिक

5
यह भी खूब रही। समाधान में जहां मैंने इसका इस्तेमाल किया, मुझे एक enumमूल्य के आधार पर राज्य को बदलने की आवश्यकता थी । StackOverflow पर इस जवाब से मुझे मदद मिली।
कैस्परमोर्च

उस संपत्ति को न भूलें जिसे आप होना चाहते हैंpublic
सीएडी

17

उसी के बिना DataTriggerभी किया जा सकता है :

 <DataGrid.RowStyle>
     <Style TargetType="DataGridRow">
         <Setter Property="Background" >
             <Setter.Value>
                 <Binding Path="State" Converter="{StaticResource BooleanToBrushConverter}">
                     <Binding.ConverterParameter>
                         <x:Array Type="SolidColorBrush">
                             <SolidColorBrush Color="{StaticResource RedColor}"/>
                             <SolidColorBrush Color="{StaticResource TransparentColor}"/>
                         </x:Array>
                     </Binding.ConverterParameter>
                 </Binding>
             </Setter.Value>
         </Setter>
     </Style>
 </DataGrid.RowStyle>

BooleanToBrushConverterनिम्नलिखित वर्ग कहाँ है:

public class BooleanToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Brushes.Transparent;

        Brush[] brushes = parameter as Brush[];
        if (brushes == null)
            return Brushes.Transparent;

        bool isTrue;
        bool.TryParse(value.ToString(), out isTrue);

        if (isTrue)
        {
            var brush =  (SolidColorBrush)brushes[0];
            return brush ?? Brushes.Transparent;
        }
        else
        {
            var brush = (SolidColorBrush)brushes[1];
            return brush ?? Brushes.Transparent;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

इससे भी बेहतर एक IMultiValueConverter ( docs.microsoft.com/en-us/dotnet/api/… ) का आवेदन है, बस एक से अधिक संपत्ति को बांधना और कनवर्टर को उन कई गुणों की स्थिति के लिए सही रंग वापस करना है (I ommit) नमूना इसके बाद से सामान्य कनवर्टर मामले के समान है, लेकिन मैं इसे पोस्ट कर सकता हूं किसी को भी इसकी आवश्यकता होनी चाहिए)
user8276908

7

XAML में, मेरे कर्मचारी ऑब्जेक्ट में परिभाषित रंग के लिए, पंक्ति की पृष्ठभूमि सेट करने के लिए एक लक्ष्य के साथ DataGrid के लिए एक RowStyle संपत्ति जोड़ें और परिभाषित करें

<DataGrid AutoGenerateColumns="False" ItemsSource="EmployeeList">
   <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
             <Setter Property="Background" Value="{Binding ColorSet}"/>
        </Style>
   </DataGrid.RowStyle>

और मेरे कर्मचारी वर्ग में

public class Employee {

    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    public string ColorSet { get; set; }

    public Employee() { }

    public Employee(int id, string name, int age)
    {
        Id = id;
        Name = name;
        Age = age;
        if (Age > 50)
        {
            ColorSet = "Green";
        }
        else if (Age > 100)
        {
            ColorSet = "Red";
        }
        else
        {
            ColorSet = "White";
        }
    }
}

इस तरह से हर डेटा ग्रिड की पंक्ति है पृष्ठभूमि रंग की ColorSet मेरी वस्तु की संपत्ति


मुझे यह पसंद है कि ऑब्जेक्ट के रंग के लिए यह विधि दृश्य के बजाय मॉडल में ही केंद्रीकृत है।
33मेगा मैन

1
सिवाय इसके कि यह एमवीवीएम का उल्लंघन करता है। अगर आपको परवाह नहीं है, तो उस पर ध्यान दें। लेकिन उपयोगकर्ता अनुभव मॉडल द्वारा निर्धारित नहीं किया जाना चाहिए। यही दृश्य / दृश्य मॉडल का काम है
ब्रायनवीपीएस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.