كيف أقوم بربط عرض تعريف العمود أو ارتفاع تعريف الصف؟

StackOverflow https://stackoverflow.com/questions/147908

سؤال

ضمن نمط View-Model-ViewModel لـ WPF، أحاول ربط بيانات الارتفاعات والعروض لتعريفات مختلفة لعناصر تحكم الشبكة، حتى أتمكن من تخزين القيم التي يضبطها المستخدم عليها بعد استخدام GridSplitter.ومع ذلك، يبدو أن النمط العادي لا يعمل مع هذه الخصائص المحددة.

ملحوظة:أقوم بنشر هذا كسؤال مرجعي أقوم بنشره لأن Google خذلتني وكان علي حل هذا الأمر بنفسي.إجابتي الخاصة للمتابعة.

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

المحلول 2

كان هناك عدد من المعضلات التي اكتشفتها:

  1. على الرغم من أنه قد يبدو مزدوجًا في XAML، إلا أن القيمة الفعلية لارتفاع أو عرض *التعريف هي بنية "GridLength".
  2. جميع خصائص GridLength قابلة للقراءة فقط، ويجب عليك إنشاء واحدة جديدة في كل مرة تقوم فيها بتغييرها.
  3. على عكس كل الخصائص الأخرى في WPF، لا يقوم Width وHeight بتعيين وضع ربط البيانات الافتراضي الخاص بهما على "TwoWay"، بل يتعين عليك تعيين هذا يدويًا.

ولذلك استخدمت الكود التالي:

private GridLength myHorizontalInputRegionSize = new GridLength(0, GridUnitType.Auto)
public GridLength HorizontalInputRegionSize
{
    get
    {
        // If not yet set, get the starting value from the DataModel
        if (myHorizontalInputRegionSize.IsAuto)
            myHorizontalInputRegionSize = new GridLength(ConnectionTabDefaultUIOptions.HorizontalInputRegionSize, GridUnitType.Pixel);
        return myHorizontalInputRegionSize;
    }
    set
    {
        myHorizontalInputRegionSize = value;
        if (ConnectionTabDefaultUIOptions.HorizontalInputRegionSize != myHorizontalInputRegionSize.Value)
        {
            // Set the value in the DataModel
            ConnectionTabDefaultUIOptions.HorizontalInputRegionSize = value.Value;
        }
        OnPropertyChanged("HorizontalInputRegionSize");
    }
}

و XAML:

<Grid.RowDefinitions>
    <RowDefinition Height="*" MinHeight="100" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="{Binding Path=HorizontalInputRegionSize,Mode=TwoWay}" MinHeight="50" />
</Grid.RowDefinitions>

نصائح أخرى

إنشاء IValueConverter على النحو التالي:

public class GridLengthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double val = (double)value;
        GridLength gridLength = new GridLength(val);

        return gridLength;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        GridLength val = (GridLength)value;

        return val.Value;
    }
}

يمكنك بعد ذلك استخدام المحول في الرابط الخاص بك:

<UserControl.Resources>
    <local:GridLengthConverter x:Key="gridLengthConverter" />
</UserControl.Resources>
...
<ColumnDefinition Width="{Binding Path=LeftPanelWidth, 
                                  Mode=TwoWay,
                                  Converter={StaticResource gridLengthConverter}}" />

احتمال آخر، منذ أن طرحت التحويل بين GridLength و int, ، هو إنشاء IValueConverter واستخدامها عند الربط Width. IValueConverterيتعامل أيضًا مع الارتباط ثنائي الاتجاه لأنه يحتوي على كليهما ConvertTo() و ConvertBack() طُرق.

الحل الأسهل هو ببساطة استخدام إعدادات السلسلة لهذه الخصائص بحيث يدعمها WPF تلقائيًا باستخدام GridLengthConverter دون أي عمل إضافي.

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