Я не могу получить свойство модели представления в многозначном конвертере - PullRequest
0 голосов
/ 05 августа 2020

У меня DataGrid. Я хочу решить, когда свернуть столбец, а когда его показать.

Это мой код:

<UserControl.Resources>
   <ResourceDictionary>
      <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}" />
   </ResourceDictionary>
<UserControl.Resources>
<DataGridTextColumn.Visibility>
   <MultiBinding Converter="{StaticResource MyMultiValueConverter}">
      <Binding Source="{StaticResource ProxyElement}" Path="DataContext.MyPropertyInViewModel" />
      <Binding Source="1"/>
   </MultiBinding>
</DataGridTextColumn.Visibility> 
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
   //Do  the conversion
}

Мне нужен прокси-элемент для доступа к представлению модель из элемента, который не принадлежит визуальному дереву.

В MultiBinding работает вторая привязка. В преобразователе я получаю значение 1, но проблема с первым элементом. Я не понимаю свойства модели представления, что это string. Я получаю DependencyProperty.UnsetValue.

Как я могу передать свойство моей модели представления в многозначный преобразователь?

1 Ответ

1 голос
/ 05 августа 2020

ProxyElement не будет связывать контекст данных в Resources, поскольку он не является частью визуального дерева. Чтобы это работало, определите FrameworkElement в любом месте визуального дерева, например, как показано ниже в Grid. DataContext наследуется, но вы также можете установить его явно. Установите Visibility прокси на Collapsed, чтобы он был скрыт.

<Grid>
   <!-- ...grid definitions. -->
   <FrameworkElement Grid.Row="42" x:Name="ProxyElement" Visibility="Collapsed"/>
</Grid>

Ссылка на него, используя x:Reference, поскольку привязки ElementName работают только в визуальном дереве, а столбцы - нет. его часть.

<DataGridTextColumn.Visibility>
   <MultiBinding Converter="{StaticResource MyMultiValueConverter}">
      <Binding Source="{x:Reference ProxyElement}" Path="DataContext.InitialDepositAmount"/>
      <Binding Source="1"/>
   </MultiBinding>
</DataGridTextColumn.Visibility>

Лучше использовать Freezable в качестве прокси привязки. Они могут получить доступ к контексту данных даже за пределами визуального дерева. См. Этот пост по теме , в котором показан подход с настраиваемым BindingProxy, который также работает в Resources и без x:Reference.

...