Die Bindung von einer benutzerdefinierten Eigenschaft

stimmen
0

Ich bin neu im Forum und sehr neu in Silverlight. Ich und meine Mitarbeiter arbeiten an einer benutzerdefinierten Anwendung. Wir bauen ein Menüsystem, das Tasten nur, wenn dieser useris in einer zugewiesenen Rolle angezeigt wird. Eine neue Eigenschaft wurde erstellt Rollen zu ermöglichen, definiert werden, und zu Testzwecken versuchen wir einfach diesen Wert zuweisen, die eine Zeichenfolge ist, in eine Text Eigenschaft des Textblockes. Einige Code angebracht ist.

Dies ist eines der Elemente der Sammlung hinzugefügt werden. die allowedroles Eigenschaft ist die String übergeben, kann dies über den Debugger zu sehen.

<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

Die Elemente werden in einem Listenfeld angezeigt wird, gibt es keine Fehler, aber die Bindung funktioniert nicht. Ich versuchte auch, die Bindung in der Listbox der Datenvorlage zu tun. Ich entschuldige, wenn dies verwirrend ist, dass ich nicht‘wissen, wie so etwas in leicht zu schreiben Stücke zu verstehen.

Vielen Dank

Veröffentlicht am 09/12/2008 um 20:03
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
0

Wenn Sie die Binding-Syntax verwenden sind verbindlich Sie die Datacontext des Objekts. So Ihre Bindung:

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

Ist im Grunde sagen, hol mir die Eigenschaft „AllowedRoles“ auf meiner Datacontext. Da der Datenkontext wahrscheinlich null ist (habe es nicht gesetzt ist), werden Sie keinen Wert in Ihrem Textblock zu bekommen.

Was Sie wahrscheinlich eine Vorlage für Ihre MenuButton und dann in der Vorlage tun möchte, ist definieren können Sie sagen:

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

Welche gesetzt wird erhalten, wenn Sie die Vorlage auf das Element anzuwenden.

Hier sind einige Links, die ich in einem anderen Thread geschrieben auf Vorlagen und generic.xaml Verständnis:

  • Steuer Customization
  • Skinnable Custom Controls
  • Tweaking Standardstile
  • 3 gute Links auf generic.xaml

Viel Glück!

Beantwortet am 09/12/2008 um 23:46
quelle vom benutzer

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

Die vorstehende Linie ist, wo der allowedroles Wert zugewiesen wird. Ich bin an diesem Punkt eine neue Instanz einer Taste erzeugt wird.

Wo ich versuche erlaubt Rollen zu binden, den Textblock wahrscheinlich völlig falsch ist, aber es funktioniert nicht, auch wenn es in der Listbox der Datatemplate getan wird.

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

In der Tat, wie man es von diesem kleinen Ausschnitt sehen kann, habe ich eine rect Setup zusammen mit der Leinwand. Ich sehe die rect nicht, die nur für Testzwecke war, so ist es fast wie meine Vorlage ignoriert wird. Ich habe das Listenfeld als folows einrichten

<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}">
Beantwortet am 10/12/2008 um 14:58
quelle vom benutzer

stimmen
0

Dies ist ein kleines Beispiel dafür, was wir zu tun versuchen. Ich kann den Inhalt von „VerticalButton“ erhalten und zeigt es ganz gut, aber wir müssen auf der „AllowedRoles“ Abhängigkeitseigenschaft in der Vorlage erhalten zu können, weil das Endziel die Sichtbarkeit des Elements, um diese Eigenschaft zu binden ist (nach Erzeugen eines IValueConverter). Wir können einfach nicht scheinen, unsere Köpfe umschlingen, wie man die AllowedRoles Vorlage aus der Listbox der ItemTemplate zu bekommen.

Hier ist die 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>

Hier ist die Klasse Code. Ziemlich einfach .. leitet sich von Button und hat einen DP definiert. Beachten Sie auch die Sammlung Klasse an der Unterseite.

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
Beantwortet am 10/12/2008 um 21:56
quelle vom benutzer

stimmen
0

Endete diese Arbeit immer durch die folgenden tun. Einer der Tricks ist, dass man nicht einen Konverter auf einer Vorlage verwenden kann, die Bindung so binden Sie die Datacontext des Objekts unter Verwendung einer Schablone Bindung und dann eine regelmäßige Bindung verwenden, die für den Zugriff.

<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
Beantwortet am 12/12/2008 um 16:12
quelle vom benutzer

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