Использование переменной C # из пользовательского элемента управления в xaml (silverlight) - PullRequest
0 голосов
/ 19 ноября 2011

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

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

И информация мне нужна для управления ресурсами в xaml, но я не могу связать строки из C # с тем, что мне нужно в xaml:

Код C #:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Threading;
using WFSilverlight.Shared;
using WFSilverlight.Core;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using BG_CalgaryNC_11611.Controls;

namespace BG_CalgaryNC_11611
{
public partial class BG_Calgary_Text_Nav : UserControl
{
    //public string NavPage = String.Empty;
    [Category("BG")]
    public string PageToNavigate { get; set; }

    [Category("BG")]
    public string DesciptionPageName { get; set; }

    [Category("BG")]
    public string DisplayName { get; set; }

    public BG_Calgary_Text_Nav()
    {
        InitializeComponent();

        NavText.Text = DisplayName;
        NavPage = "BG_CalgaryNC_11611_" + PageToNavigate;

        //this.DataContext = this;
        //NavText.Resources.Add("navPageResourse", NavPage);
        //NavText.Resources.Add("displayNameResourse", DesciptionPageName);

    }

    public string NavPage { get; set; }
}
}

Где я хочу использовать «NavPage» и «DesciptionPageName» для добавления затем в xaml.

Код xaml:

    <UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:BG_CalgaryNC_11611_Controls="clr-namespace:BG_CalgaryNC_11611.Controls" 
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
mc:Ignorable="d"

x:Class="BG_CalgaryNC_11611.BG_Calgary_Text_Nav"
d:DesignWidth="640" d:DesignHeight="480">

<Grid x:Name="LayoutRoot" Cursor="Hand">
    <Viewbox HorizontalAlignment="Right" VerticalAlignment="Top">
        <TextBlock x:Name="NavText" TextWrapping="Wrap" FontSize="10.667" FontWeight="Bold" Text="TC9-21" Height="16" Width="43">
            <TextBlock.Resources>
                <BG_CalgaryNC_11611_Controls:TranslatableCPNavItem Description="{Binding NavPage, Mode=OneWay}" Source="{Binding DesciptionPageName, Mode=OneWay}" x:Key="target1"/>
            </TextBlock.Resources>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonUp">
                    <i:InvokeCommandAction Command="{Binding NavigatToCommand, Mode=OneWay}" CommandParameter="{StaticResource target1}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <TextBlock.Foreground>
                <SolidColorBrush Color="{StaticResource BG_ConnectionArrow_Color}"/>
            </TextBlock.Foreground></TextBlock>
    </Viewbox>
</Grid>

Я могу построить проект, но когда я добавляю пользовательский элемент управления, я получаю эту ошибку:

объект типа 'system.windows.data.binding' не может быть преобразован в тип 'system.string'

Надеюсь, вы сможете мне помочь.

1 Ответ

1 голос
/ 19 ноября 2011

Я подозреваю, что проблема в этой строке

    <BG_CalgaryNC_11611_Controls:TranslatableCPNavItem Description="{Binding NavPage, Mode=OneWay}" Source="{Binding DesciptionPageName, Mode=OneWay}" x:Key="target1"/>

Вы не указали источник своего TranslatableCPNavItem класса, поэтому мне придется сделать предположение на основе кода другого класса, который вы предоставили выше. Я предполагаю, что свойство Description в этом классе реализовано как «простое» свойство, такое как

    public string Description { get; set; }

Вы не можете применить Binding к такой собственности, как эта. Если вы хотите, чтобы свойство было установлено с помощью привязки, оно должно быть свойством зависимости . Вместо этого он должен выглядеть примерно так:

    public string Description
    {
        get { return (string)GetValue(DescriptionProperty); }
        set { SetValue(DescriptionProperty, value); }
    }

    public static readonly DependencyProperty DescriptionProperty =
        DependencyProperty.Register("Description",
                                    typeof(string),
                                    typeof(TranslateableCPNavItem),
                                    null);

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

...