كيف أقوم بربط عرض تعريف العمود أو ارتفاع تعريف الصف؟
-
02-07-2019 - |
سؤال
ضمن نمط View-Model-ViewModel لـ WPF، أحاول ربط بيانات الارتفاعات والعروض لتعريفات مختلفة لعناصر تحكم الشبكة، حتى أتمكن من تخزين القيم التي يضبطها المستخدم عليها بعد استخدام GridSplitter.ومع ذلك، يبدو أن النمط العادي لا يعمل مع هذه الخصائص المحددة.
ملحوظة:أقوم بنشر هذا كسؤال مرجعي أقوم بنشره لأن Google خذلتني وكان علي حل هذا الأمر بنفسي.إجابتي الخاصة للمتابعة.
المحلول 2
كان هناك عدد من المعضلات التي اكتشفتها:
- على الرغم من أنه قد يبدو مزدوجًا في XAML، إلا أن القيمة الفعلية لارتفاع أو عرض *التعريف هي بنية "GridLength".
- جميع خصائص GridLength قابلة للقراءة فقط، ويجب عليك إنشاء واحدة جديدة في كل مرة تقوم فيها بتغييرها.
- على عكس كل الخصائص الأخرى في 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 دون أي عمل إضافي.