Привязка из пользовательского свойства - PullRequest
0 голосов
/ 09 декабря 2008

Я новичок в форуме и очень новичок в Silverlight. Я и мой коллега работаем над пользовательским приложением. Мы создаем систему меню, которая будет отображать кнопки, только если этот пользователь назначен на роль. Было создано новое свойство, позволяющее определять роли, и в целях тестирования мы просто пытаемся присвоить это значение, которое является строкой, текстовому свойству текстового блока. Некоторый код прилагается.

Это один из предметов, добавляемых в коллекцию. Свойство allowroles передает строку, это можно увидеть через отладчик.

<MenuButton:VerticalButtonCollection x:Key="VerticalButtonsDS" d:IsDataSource="True">

<MenuButton:VerticalButton AllowedRoles="test, test2"> 
<TextBlock Text="{Binding AllowedRoles}"></TextBlock>

</MenuButton:VerticalButton>

</MenuButton:VerticalButtonCollection>

Code for the allowed roles property  
Public Shared ReadOnly AllowedRolesProperty As DependencyProperty = DependencyProperty.Register("AllowedRoles", GetType(String), GetType(mButton), New PropertyMetadata(New PropertyChangedCallback(AddressOf onAllowedRolesChanged)))


Public Shared Sub onAllowedRolesChanged(ByVal d As DependencyObject, ByVal args As DependencyPropertyChangedEventArgs) 
     Dim sender As mButton = CType(d, mButton)
     sender.AllowedRoles = CStr(args.NewValue)
End Sub

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

Спасибо

Ответы [ 4 ]

0 голосов
/ 12 декабря 2008

Закончилось, чтобы это заработало, сделав следующее. Один из приемов заключается в том, что вы не можете использовать конвертер для привязки шаблона, поэтому вы привязываете DataContext объекта, используя привязку шаблона, а затем используете обычную привязку для доступа к нему.

<UserControl.Resources>
    <mt:AllowedRolesConverter x:Key="RolesConverter"></mt:AllowedRolesConverter>

    <Style x:Key="VerticalButton1Style" TargetType="mt:VerticalButton">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="mt:VerticalButton">
                    <Grid x:Name="RootGrid" DataContext="{TemplateBinding AllowedRoles}" Visibility="{Binding Converter={StaticResource RolesConverter}}">

                        <Border x:Name="border" BorderThickness="1">
                            <Border.BorderBrush>
                                <SolidColorBrush x:Name="borderBrush" Opacity="0" Color="Blue"/>
                            </Border.BorderBrush>
                            <ContentPresenter x:Name="VBContent"
                                              ContentTemplate="{TemplateBinding ContentTemplate}" 
                                              >

                            </ContentPresenter>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <mt:VerticalButtonCollection x:Key="TestCollection">
        <mt:VerticalButton AllowedRoles="Test1" 
                           Style="{StaticResource VerticalButton1Style}" 
                           Click="VerticalButton_Click"
                           >
            <TextBlock Text="Test Button"></TextBlock>
        </mt:VerticalButton>
        <mt:VerticalButton AllowedRoles="Test1" 
                           Style="{StaticResource VerticalButton1Style}" Click="VerticalButton_Click_1">
            <Ellipse Width="50" Height="50" Fill="Blue"></Ellipse>
        </mt:VerticalButton>
    </mt:VerticalButtonCollection>

    <Style x:Key="ListItemStyle" TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <StackPanel x:Name="Root" Orientation="Horizontal">
                        <ContentPresenter Margin="5,5,5,5"/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="ListStyle" TargetType="ListBox">
        <Setter Property="ItemContainerStyle" Value="{StaticResource ListItemStyle}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBox">
                    <Grid x:Name="Root">
                        <ItemsPresenter></ItemsPresenter>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
    <ListBox Style="{StaticResource ListStyle}" ItemsSource="{StaticResource TestCollection}" />
</Grid>

    Public Class VerticalButton
    Inherits Button
    Implements INotifyPropertyChanged

    Public Property AllowedRoles() As String
        Get
            Return CStr(GetValue(AllowedRolesProperty))
        End Get
        Set(ByVal value As String)
            SetValue(AllowedRolesProperty, value)
        End Set
    End Property

    Public Shared ReadOnly AllowedRolesProperty As DependencyProperty = DependencyProperty.Register("AllowedRoles", GetType(String), GetType(VerticalButton), New PropertyMetadata(New PropertyChangedCallback(AddressOf OnAllowedRolesChanged)))

    Public Shared Sub OnAllowedRolesChanged(ByVal d As DependencyObject, ByVal args As DependencyPropertyChangedEventArgs)
        Dim sender As VerticalButton = CType(d, VerticalButton)
        sender.AllowedRoles = CStr(args.NewValue)
    End Sub

    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
End Class

Public Class VerticalButtonCollection
    Inherits ObservableCollection(Of VerticalButton)

End Class
0 голосов
/ 10 декабря 2008
<MenuButton:VerticalButton AllowedRoles="test, test2"> 

В приведенной выше строке указывается значение позволенных ролей. В этот момент я создаю новый экземпляр кнопки.

Где я пытаюсь привязать разрешенные роли к текстовому блоку, вероятно, совершенно неправильно, но это не работает, даже если это делается в таблице данных списка.

<DataTemplate x:Key="VerticalMenuItemTemplate">
            <Canvas>
            <TextBlock Text="{Binding AllowedRoles}">
            </TextBlock>
            <Rectangle Height="500" Width="500" Fill="Blue"></Rectangle></Canvas>
        </DataTemplate>

На самом деле, как вы можете видеть из этого небольшого фрагмента, у меня есть прямоугольная настройка вместе с холстом. Я не вижу прямоугольник, который был только для целей тестирования, так что мой шаблон почти игнорируется. У меня есть список со следующими настройками

<ListBox x:Name="VerticalContainer" Width="81" Height="Auto" HorizontalAlignment="Center" DataContext="{Binding Mode=OneWay, Source={StaticResource VerticalButtonCollectionDS}}" Padding="0,0,0,0" Canvas.Top="-14" ItemTemplate="{StaticResource VerticalMenuItemTemplate}">
0 голосов
/ 10 декабря 2008

Это небольшой пример того, что мы пытаемся сделать. Я могу получить содержимое «VerticalButton» и отобразить его очень хорошо, но нам нужно иметь возможность получить свойство зависимости «AllowedRoles» в шаблоне, потому что конечной целью является привязка видимости элемента к этому свойству (После создание IValueConverter). Мы просто не можем понять, как добраться до шаблона AllowedRoles из ItemTemplate списка.

Вот Page.xaml:

<UserControl x:Class="AnnexAMapTool.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mt="clr-namespace:AnnexAMapTool;assembly=AnnexAMapTool"
    Width="400" Height="300">
    <UserControl.Resources>

        <mt:VerticalButtonCollection x:Key="TestCollection">
            <mt:VerticalButton AllowedRoles="Test1, Test2" Content="VBContent"></mt:VerticalButton>
        </mt:VerticalButtonCollection>

        <Style x:Key="ListItemStyle" TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <StackPanel x:Name="Root" Orientation="Horizontal">
                            <TextBlock Foreground="Red" Text="{Binding AllowedRoles}"></TextBlock>
                            <Ellipse Width="20" Height="20" Fill="Blue"></Ellipse>
                            <ContentPresenter Content="{TemplateBinding Content}" Margin="5,5,5,5"/>
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="ListStyle" TargetType="ListBox">
            <Setter Property="ItemContainerStyle" Value="{StaticResource ListItemStyle}" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBox">
                        <Grid x:Name="Root">
                            <ItemsPresenter></ItemsPresenter>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <ListBox Style="{StaticResource ListStyle}" ItemsSource="{StaticResource TestCollection}" />
    </Grid>
</UserControl>

Вот код класса. Довольно простой .. происходит от ButtonBase и имеет один определенный DP. Также обратите внимание на класс коллекции внизу.

Imports System.Windows.Controls.Primitives
Imports System.Collections.ObjectModel

Public Class VerticalButton
    Inherits ButtonBase

    Public Property AllowedRoles() As String
        Get
            Return GetValue(AllowedRolesProperty)
        End Get
        Set(ByVal value As String)
            SetValue(AllowedRolesProperty, value)
        End Set
    End Property

    Public Shared ReadOnly AllowedRolesProperty As DependencyProperty = DependencyProperty.Register("AllowedRoles", GetType(String), GetType(VerticalButton), New PropertyMetadata(New PropertyChangedCallback(AddressOf OnAllowedRolesChanged)))

    Public Shared Sub OnAllowedRolesChanged(ByVal d As DependencyObject, ByVal args As DependencyPropertyChangedEventArgs)
        Dim sender As VerticalButton = CType(d, VerticalButton)
        sender.AllowedRoles = CStr(args.NewValue)
    End Sub

End Class

Public Class VerticalButtonCollection
    Inherits ObservableCollection(Of VerticalButton)

End Class
0 голосов
/ 10 декабря 2008

Когда вы используете синтаксис Binding, вы привязываетесь к объекту DataContext. Итак, твоя привязка:

<MenuButton:VerticalButton AllowedRoles="test, test2"> 
  <TextBlock Text="{Binding AllowedRoles}"></TextBlock>
</MenuButton:VerticalButton>

По сути, говорит мне, чтобы получить свойство «AllowedRoles» в моем DataContext. Поскольку контекст данных, вероятно, равен нулю (он не был установлен), вы не получаете никакого значения в своем текстовом блоке.

Что вы, вероятно, хотите сделать, это определить шаблон для кнопки меню, а затем в шаблоне вы можете сказать:

<TextBlock Text="{TemplateBinding AllowedRoles}"></TextBlock>

Что будет установлено, когда вы примените шаблон к элементу.

Вот несколько ссылок, которые я разместил в другой ветке о понимании шаблонов и generic.xaml:

  • Настройка управления
  • Skinnable Custom Controls
  • Настройки по умолчанию
  • 3 хорошие ссылки на generic.xaml

Удачи!

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