Vinculativo a partir de uma propriedade personalizada

votos
0

Eu sou novo no forum e muito novo para Silverlight. Eu e meu colega de trabalho está trabalhando em um aplicativo personalizado. Estamos construindo um sistema de menu que só irá mostrar botões se que useris em uma função atribuída. Uma nova propriedade foi criado para permitir papéis a ser definido, e para fins de teste estamos simplesmente tentando atribuir esse valor, que é uma string, a propriedade de texto de um bloco de texto. Algum código é anexado.

Este é um dos itens a serem adicionados à coleção. a propriedade allowedroles está passando a corda, isso pode ser visto através do depurador.

<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

Os itens são exibidos em uma caixa de lista, não há erros, mas a ligação não funciona. Eu até tentei fazer a ligação no modelo de dados da caixa de listagem. I appologize se isso é confuso, eu não' sabe como postar algo parecido com isso em fácil compreender peças.

obrigado

Publicado 09/12/2008 em 20:03
fonte usuário
Em outras línguas...                            


4 respostas

votos
0

Acabou ficando este trabalho, fazendo o seguinte. Um dos truques é que você não pode usar um conversor em uma ligação para que você ligar o DataContext do objeto usando uma ligação de modelo e, em seguida, usar uma ligação regular para acessar esse modelo.

<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
Respondeu 12/12/2008 em 16:12
fonte usuário

votos
0

Este é um pequeno exemplo do que estamos tentando fazer. Posso obter o conteúdo de "VerticalButton" e exibi-lo muito bem, mas é preciso ser capaz de obter no "AllowedRoles" propriedade de dependência no modelo, porque o objetivo final é a de vincular a visibilidade do item a esta propriedade (Após criando um IValueConverter). Nós apenas não pode parecer para embrulhar nossas cabeças em torno de como chegar ao modelo AllowedRoles de ItemTemplate do ListBox.

Aqui está o 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>

Aqui está o código de classe. Bastante básico .. deriva ButtonBase e tem um DP definido. Observe também a classe de coleção na parte inferior.

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
Respondeu 10/12/2008 em 21:56
fonte usuário

votos
0
<MenuButton:VerticalButton AllowedRoles="test, test2"> 

A linha acima é onde o valor allowedroles é atribuído. Estou criando uma nova instância de um botão naquele ponto.

Onde eu estou tentando ligar papéis permitidos para o textblock é provavelmente completamente errado, mas ele não funciona, mesmo se ele está sendo feito em datatemplate da caixa de listagem.

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

Na verdade, como você pode ver a partir deste pequeno trecho, Eu tenho uma configuração rect juntamente com a tela. Eu não vejo o rect, que era apenas para fins de teste, por isso é quase como meu modelo está a ser ignorado. Eu tenho a caixa de lista configurado como folows

<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}">
Respondeu 10/12/2008 em 14:58
fonte usuário

votos
0

Quando você usa a sintaxe de ligação que você está ligação a DataContext do objeto. Portanto, sua ligação:

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

Está basicamente dizendo me a propriedade "AllowedRoles" no meu DataContext. Desde o contexto de dados é provavelmente nula (não vê-lo sendo definido) você não está recebendo qualquer valor em seu bloco de texto.

O que você provavelmente quer fazer é definir um modelo para o seu MENUBUTTON e, em seguida, no modelo que você pode dizer:

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

Que irá obter criado quando você aplica o modelo para o item.

Aqui estão alguns links que eu postei em outro segmento na compreensão modelos e generic.xaml:

  • Personalização de controle
  • Controles personalizados que trocam de capa
  • Estilos ajustes predefinidos
  • 3 bons links generic.xaml

Boa sorte!

Respondeu 09/12/2008 em 23:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more