Связывание с пользовательским свойства

голоса
0

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

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

<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

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

благодаря

Задан 09/12/2008 в 20:03
источник пользователем
На других языках...                            


4 ответов

голоса
0

В конечном итоге получить эту работу, выполнив следующие действия. Один из трюков, которые вы не можете использовать преобразователь на шаблоне связывания, так что вы связать 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
Ответил 12/12/2008 в 16:12
источник пользователем

голоса
0

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

Вот 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
Ответил 10/12/2008 в 21:56
источник пользователем

голоса
0
<MenuButton:VerticalButton AllowedRoles="test, test2"> 

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

Где я пытаюсь связать разрешенные роли к TextBlock, вероятно, совершенно неправильно, но это не работает, даже если это делается в DataTemplate в ListBox в.

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

На самом деле, как вы можете видеть из этого небольшого фрагмента кода, у меня есть установка прямоугольника вместе с полотном. Я не вижу прямоугольник, который был только для целей тестирования, так что это почти как мой шаблон игнорируется. У меня есть поле со списком, как настроить 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}">
Ответил 10/12/2008 в 14:58
источник пользователем

голоса
0

При использовании привязок синтаксиса вы привязка к DataContext объекта. Так что ваши привязки:

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

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

То, что вы, вероятно, хотите сделать, это определить шаблон для вашего кнопку MENU, а затем в шаблоне вы можете сказать:

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

Какой будет получить набор, если применить шаблон к элементу.

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

  • Настройка управления
  • Skinnable Пользовательские элементы управления
  • Тонкая настройка по умолчанию Стили
  • 3 хорошие ссылки на Generic.xaml

Удачи!

Ответил 09/12/2008 в 23:46
источник пользователем

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