Wiązania z właściwości niestandardowej

głosy
0

Jestem nowy na forum i bardzo nowe do Silverlight. Ja i mój współpracownik pracują nad aplikacji niestandardowej. Budujemy system menu, które będą wyświetlane tylko przyciski jeśli useris w przypisanej roli. Nowa nieruchomość został stworzony, aby umożliwić role, które zostaną określone, a dla celów testowych jesteśmy po prostu stara się przypisać tę wartość, która jest ciągiem znaków, mienia tekstu TextBlock za. Niektóre kod jest załączony.

Jest to jeden z elementów, które mają być dodane do kolekcji. własność allowedroles przechodzi ciąg, może to być postrzegane przez debugger.

<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

Pozycje są wyświetlane w polu listy, nie ma żadnych błędów, ale wiążący nie działa. I nawet próbował zrobić wiązanie w szablonie danych ListBox za. I to przepraszam, jeśli jest to dziwne, że nie”wiedzą, jak pisać coś takiego w łatwy do zrozumienia sztuk.

Dzięki

Utwórz 09/12/2008 o 20:03
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
0

Skończyło się tej pracy, wykonując następujące czynności. Jednym z trików jest to, że nie można użyć konwertera na szablonie wiązania więc wiązać DataContext obiektu przy użyciu szablonu wiążącego, a następnie użyć regularne wiązanie aby uzyskać dostęp.

<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
Odpowiedział 12/12/2008 o 16:12
źródło użytkownik

głosy
0

Jest to mały przykład tego, co staramy się robić. Mogę treść „VerticalButton” i wyświetlić go dobrze, ale musimy być w stanie dostać się na „AllowedRoles” właściwość zależność w szablonie, ponieważ ostatecznym celem jest związanie widoczności elementu tej właściwości (Po tworzenie IValueConverter). Po prostu nie może się owinąć wokół głowy jak dostać się do szablonu AllowedRoles z pola listy w ItemTemplate.

Oto 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>

Oto kod klasy. Dość prosty .. wywodzi ButtonBase i ma jeden DP zdefiniowane. Należy także zwrócić uwagę na klasę zbiórki na dole.

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
Odpowiedział 10/12/2008 o 21:56
źródło użytkownik

głosy
0
<MenuButton:VerticalButton AllowedRoles="test, test2"> 

Powyższa linia jest, gdy jest przypisana wartość allowedroles. Tworzę nową instancję przycisku w tym punkcie.

Gdzie Próbuję powiązać dozwolony role do TextBlock jest prawdopodobnie całkowicie błędne, ale to nie działa, nawet jeśli jest to robione w DataTemplate ListBox za.

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

W rzeczywistości, jak widać z tego małego fragmentu, mam setup rect wraz z płótna. Nie widzę rect, która była tylko w celach testowych, więc to prawie jak mój szablon jest ignorowany. Mam pole listy utworzone jako 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}">
Odpowiedział 10/12/2008 o 14:58
źródło użytkownik

głosy
0

Podczas korzystania składni Binding jesteś wiążące do DataContext obiektu. Więc wiązania:

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

Jest w zasadzie mówiąc mi się własnością „AllowedRoles” na moim DataContext. Ponieważ kontekst danych jest prawdopodobnie zerowa (nie widzi to jest ustawione) nie otrzymujesz żadnej wartości w swoim bloku tekstu.

Co prawdopodobnie chcesz zrobić, to określić szablon dla swojej MenuButton a następnie w szablonie można powiedzieć:

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

Który będzie się ustawić po zastosowaniu szablonu elementu.

Oto kilka linków, które napisałem w innym wątku na zrozumieniu szablonów i generic.xaml:

  • Dostosowanie kontrola
  • Skinnable Przetwarzania
  • Podkręcanie domyślne style
  • 3 dobre linki na generic.xaml

Powodzenia!

Odpowiedział 09/12/2008 o 23:46
źródło użytkownik

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