Привязка данных WPF: ширина столбца определения столбца для элемента управления пользователя DependencyProperty - PullRequest
1 голос
/ 14 сентября 2010

Я не уверен, что делаю неправильно, но я пытаюсь выровнять свой пользовательский элемент управления с ColumnWidth моей сетки, используя DataBinding и DependencyProperties.

У меня есть GridView на моей странице формы, которая содержит два экземпляра пользовательского элемента управления (адрес). Адрес usercontrol содержит текстовый заголовок «header», так что я могу назвать пользовательский элемент управления «Адрес офиса» или «Почтовый адрес» и т. Д., И отформатирован с использованием его собственного GridView. Я добавил DependencyProperty в пользовательский элемент управления с именем «HeaderWidth», который является просто Int32. Проблема в том, что даже с привязками вещи не совпадают. Я не уверен, что делаю не так.

AddressField.xaml

<UserControl x:Class="AddressField" x:Name="PART_AddressFieldControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         >
 <StackPanel Orientation="Horizontal">
  <Grid x:Name="StandardView">
   <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
   </Grid.RowDefinitions>
   <Grid.ColumnDefinitions>
    <ColumnDefinition Width="{Binding ElementName=PART_AddressFieldControl, Path=HeaderWidth}" />
    <ColumnDefinition Width="1*" />
    <ColumnDefinition Width="Auto" />
    <!-- ETC REMOVED FOR COMPACTNESS -->
   </Grid.ColumnDefinitions>

   <TextBlock Grid.Row="0" Grid.Column="0" HorizontalAlignment="Right" Text="{Binding ElementName=PART_AddressFieldControl, Path=Header}" />
   <TextBox Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="8" MinWidth="300" Text="{Binding Address1}" />
   <!-- ETC REMOVED FOR COMPACTNESS -->

  </Grid>
 </StackPanel>
</UserControl>

AddressField.cs

public partial class AddressField : UserControl
{
    static AddressField()
    {
        HeaderProperty = DependencyProperty.Register("Header", typeof(String), typeof(AddressField), new UIPropertyMetadata("Address:"));

        HeaderWidthProperty = DependencyProperty.Register("HeaderWidth", typeof(Int32), typeof(AddressField), new UIPropertyMetadata());

        ViewProperty = DependencyProperty.Register("View", typeof(AddressFieldView), typeof(AddressField), new UIPropertyMetadata(AddressFieldView.STANDARD));
    }

    public AddressField()
    {
        InitializeComponent();
    }

    public String Header
    {
        get { return (String)GetValue(HeaderProperty); }
        set { SetValue(HeaderProperty, value); }
    }
    public static readonly DependencyProperty HeaderProperty;

    public Int32 HeaderWidth
    {
        get { return (Int32)GetValue(HeaderWidthProperty); }
        set { SetValue(HeaderWidthProperty, value); }
    }
    public static readonly DependencyProperty HeaderWidthProperty;
}

RegistrationForm.xaml

<!-- ETC REMOVED FOR COMPACTNESS -->

<Grid.ColumnDefinitions>
 <ColumnDefinition Width="Auto" Name="FirstWidth" />
 <ColumnDefinition Width="Auto" />
 <!-- ... ETC ... -->
</Grid.ColumnDefinitions>

<vws:AddressField Grid.Row="1" Grid.Column="0" Grid.RowSpan="3" Grid.ColumnSpan="9" Header="Office Address:" DataContext="{Binding OfficeAddressVM}" HeaderWidth="{Binding ElementName=FirstWidth, Path=ActualWidth}" />
<vws:AddressField Grid.Row="4" Grid.Column="0" Grid.RowSpan="3" Grid.ColumnSpan="9" Header="Mailing Address:" DataContext="{Binding MailingAddressVM}" HeaderWidth="{Binding ElementName=FirstWidth, Path=ActualWidth}" />

По сути, я пытаюсь выровнять текстовую метку пользовательского элемента управления по ширине первого столбца регистрационной формы.

EDIT : Да, и просто потому, что мне было любопытно: я поставил точку останова отладки, глубоко копался в дереве пользовательского интерфейса и попал в «заголовок» AddressField (TextBlock), а ActualWidth не 0,0, а 73,9 или что-то в этом роде, но пользовательский интерфейс Если принять это во внимание, он все еще не виден, потому что ширина равна 0.0.

1 Ответ

0 голосов
/ 14 сентября 2010

Есть более простые способы узнать:)

Просто поместите Grid.IsSharedSizeScope="True" на сетку в главном окне (не в элементе управления) и SharedSizeGroup="someRandomName" на все столбцы, для которых вы хотите разделить ширину - в этом случае только столбец, который вы привязали к пользователю контролировать, то есть заменить привязку с SharedSizeGroup. Это оно! Все столбцы с одинаковым значением SharedSizeGroup теперь будут иметь одинаковый размер, который является размером самого большого из них.

Конечно, он работает только с автоматическим определением размеров, но звучит так, как будто вы хотите.

Для получения дополнительной информации вы можете посмотреть здесь и здесь .

Редактировать: что касается того, что вы делали неправильно, я подозреваю, что столбец внешней сетки, размер которого соответствует Авто, но не имеет никакого собственного содержимого для размера (поскольку все элементы управления занимают несколько столбцов), принял ширина ноль. Затем привязки распространяются на пользовательские элементы управления. Там много сложных взаимодействий, и я не могу судить весь XAML, поэтому я могу ошибаться.

...