سؤال

لدي DataGrid مع أعمدة تم إنشاؤها ديناميكيًا وأحتاج إلى تغيير نمط الخلايا التي تغيرت قيمها بعد بعض عمليات التلاعب.

يتم تعريف ItemsSource لـ DataGrid على أنه List<MyTableRow>, ، أين

public class MyTableRow
{
    private string[] _values;
    private string _rowHeader;

    // getters and setters here
}

يتم إنشاء أعمدة DataGrid بالكود التالي:

for (int i = 0; i < source[0].Values.Length; i++)
{
    var col = new DataGridTextColumn();
    var binding = new Binding("Values[" + i + "]");
    col.Binding = binding;
    col.CanUserSort = false;
    this.dataGrid.Columns.Add(col);
    this.dataGrid.Columns[i].Header = columnNames[i];
}

يبدو أن DataGrid الناتج هذا

تنشأ المشكلة عندما أحاول تمييز الخلايا (نص غامق أو خلفية ملونة) التي تغيرت قيمها في ItemsSource.هذه هي النقطة التي ينقسم فيها سؤالي إلى قسمين:

  1. هل هناك طريقة "مدمجة" للتعامل مع الخلايا المتغيرة؟(ربما مع ObservableColletion أو شيء آخر)
  2. إذا كانت الإجابة لا، فكيف يمكنني تمييز الخلايا المنفصلة بناءً على فهارسها أو قيمها

لقد حاولت القيام بذلك باستخدام أنماط و/أو مشغلات xaml، ولكن اتضح أنني لا أعرف ما هي قيمة التعمية التي يجب أن أقوم بتمريرها إلى المحول

<Style TargetType="TextBlock">
    <Setter Property="Background" 
            Value="{Binding <!-- some proper binding here -->, 
                    Converter={StaticResource ValueToBrushConverter}}"/>
</Style>

الحلول الأخرى الموجودة في SO إما أن يكون لها نفس "المشكلة" في الربط أو لا تعمل.ماذا يمكنني أن أفعل لتسليط الضوء فقط واحد الخلية وليس الصف/العمود بأكمله؟يمكنني تغيير ItemsSource، MyTableRow رمز إنشاء الحقول و/أو الأعمدة، إذا لزم الأمر

هل يمكن لأحد ان يساعدني؟لقد مرت بضعة أيام منذ أن علقت بهذه المشكلة


تحديث وجدت الحل


هل كانت مفيدة؟

المحلول

وأخيرا معرفة كيفية القيام بما أريد.الحل "قذر" نوعًا ما، لكنه يعمل بشكل جيد بالنسبة لي.لقد أضفت حرف مسافة غير منقسمة إلى كل خلية أحتاج إلى تسليط الضوء عليها

private const string NBSP = "\u00A0"

كل ما تبقى للقيام به بعد ذلك هو إنشاء محول القيمة.لذلك أضفت MultiBinding في XAML الخاص بي:

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Background">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource ValueToBrushMultiConverter}" >
                    <MultiBinding.Bindings>
                        <Binding RelativeSource="{RelativeSource Self}" />
                        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" />
                    </MultiBinding.Bindings>
                 </MultiBinding
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.CellStyle>

تم تعريف المحول على أنه:

public class ValueToBrushMultiConverter : IMultiValueConverter
    {
        private const string NBSP = "\u00A0";
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var cell = (DataGridCell)values[0];
            var dgRow = (DataGridRow)values[1];

            var test = (dgRow.Item as TableRow<string, string>).Values[cell.Column.DisplayIndex];

            if (test.Contains(NBSP))
                return System.Windows.Media.Brushes.PaleGreen;
            return DependencyProperty.UnsetValue;           
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }

أمل أن هذا يساعد شخصاما!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top