Видимое связывание на основе свойств связанного объекта и модели - PullRequest
2 голосов
/ 23 сентября 2010

Сегодня я столкнулся с уникальной ситуацией, когда мне нужно было связать свойство Visible кнопки в DataGridRow, чтобы оно основывалось как на свойстве связанного объекта, так и на модели, поддерживающей его.

XAML:

<t:DataGrid ItemsSource="{Binding Items}">
    <t:DataGrid.Columns>
        <t:DataGridTemplateColumn>
            <t:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Visibility="IsEditable OR IsAdmin"/>
                </DataTemplate>
            </t:DataGridTemplateColumn.CellTemplate>
        </t:DataGridTemplateColumn>
    </t:DataGrid.Columns>
</t:DataGrid>

Модель:

class TheModel
{
    public ObservableCollection<Whatever> Items { get; set; }
    public bool IsAdmin { get; set; }
}

Класс:

class Whatever
{
    public bool IsEditable { get; set; }
}

Это поставило меня в тупик. Единственная концепция, которая могла бы сработать, могла бы заключаться в том, чтобы каким-то образом передать связанный объект и либо всю модель, либо только свойство IsAdmin статическому методу в преобразователе или чем-то еще. Есть идеи?

1 Ответ

1 голос
/ 23 сентября 2010

Во-первых, вы не можете напрямую использовать логическое значение для видимости. Вам необходимо использовать BooleanToVisibilityConverter .

Во-вторых, насчет ИЛИ , у вас есть разные варианты:

  1. Создайте свойство только для чтения IsEditableOrAdmin в Whatever, которое возвращает желаемое значение. Недостаток: Вашему Whatever потребуется обратная ссылка на TheModel.

  2. Используйте MultiBinding и напишите IMultiValueConverter . Затем передайте оба значения в MultiBinding. Поскольку TheModel больше не находится в области действия DataContext на тот момент, вы можете использовать свойство ElementName Binding для ссылки на элемент пользовательского интерфейса, где TheModel все еще доступен.

    Пример (не проверено):

    <SomeElementOutsideYourDataGrid Tag="{Binding TheModel}" />
    ...
        <Button>
            <Button.Visibility>
                <MultiBinding Converter="{StaticResource yourMultiValueConverter}">
                    <Binding Path="IsEditable" />
                    <Binding ElementName="SomeElementOutsideYourDataGrid" Path="Tag.IsAdmin"/>
                </MultiBinding>
            </Button.Visibility>
        </Button>
    
  3. Используйте более мощную среду связывания, такую ​​как PyBinding .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...