Перевод связывания из C # в XAML - PullRequest
3 голосов
/ 18 августа 2010

Я не могу заставить эту привязку работать в XAML.

Связывание в c # работает:

public partial class myControl : UserControl
{
    // get singleton instance
    InfoPool Info = InfoPool.Info;

    public myControl()
    {
        InitializeComponent();

        // Test Binding
        Binding bind = new Binding();
        bind.Source = this.Info;
        bind.Path = new PropertyPath("Time");
        txtInfoTime.SetBinding(TextBlock.TextProperty, bind);
    }
}

Связывание в XAML отсутствует:

<TextBlock x:Name="txtInfoTime" Text="{Binding Path=Time, Source=Info}" />

Путь и Источник одинаковы, так где же моя ошибка?

Thx Rob

Ответы [ 5 ]

5 голосов
/ 18 августа 2010

Вы не можете перевести его в XAML с точно такими же свойствами, потому что нет способа напрямую сослаться на this.Info.Тем не менее, вы можете достичь того же результата, установив RelativeSource:

<TextBlock x:Name="txtInfoTime" Text="{Binding Path=Info.Time, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:myControl}}}" />
2 голосов
/ 18 августа 2010

Вам необходимо установить DataContext.

Вы можете просто добавить:

DataContext = Info

после

InitializeComponent();

и изменить XAML на:

<TextBlock x:Name="txtInfoTime" Text="{Binding Time}" />
1 голос
/ 26 августа 2010

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

<StackPanel>
<TextBlock x:Name="tbprop1" 
    Text="{Binding Path=StrProp, Source={x:Static local:InfoPool.Instance}}" /> 
</StackPanel>
1 голос
/ 19 августа 2010

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

У меня есть одноэлементный класс (InfoPool.cs), который реализует INotifyChangedProperty.Он используется для предоставления привязываемых свойств всего приложения.Этот класс используется ObjectDataProvider в App.xaml.Так что привязать его к свойству

InfoPool.cs очень просто (код синглтона взят из http://csharpindepth.com/Articles/General/Singleton.aspx 5-й версии. Я изменил свойство экземпляра на метод GetInstance (), потому что для OPD требуетсяметод)

public sealed class InfoPool : INotifyPropertyChanged
{
    InfoPool()
    {
    }

    public static InfoPool GetInstance()
    {
        return Nested.instance;
    }

    class Nested
    {
        static Nested()
        {
        }

        internal static readonly InfoPool instance = new InfoPool();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }

    private String strProp = "default String";
    private Double dblProp = 1.23456;

    public String StrProp
    {
        get { return strProp; }
        set 
        { 
            strProp = value;
            OnPropertyChanged(new PropertyChangedEventArgs("StrProp"));
        }
    }

    public Double DblProp
    {
        get { return dblProp; }
        set 
        { 
            dblProp = value;
            OnPropertyChanged(new PropertyChangedEventArgs("DblProp"));
        }
    }

ObjectDataProvider в App.xaml

<Application.Resources>
    <ResourceDictionary>
        <ObjectDataProvider x:Key="OPDInfo" ObjectType="{x:Type local:InfoPool}" MethodName="GetInstance" d:IsDataSource="True"/>
    </ResourceDictionary>
</Application.Resources>

Вот 2 способа привязки к OPD

<StackPanel>
    <TextBlock x:Name="tbprop1" Text="{Binding Path=StrProp, Source={StaticResource OPDInfo}}" />
    <TextBlock x:Name="tbprop2" Text="{Binding DblProp}" ToolTip="{Binding StrProp}" DataContext="{StaticResource OPDInfo}" />
</StackPanel>

Вот и все.Пожалуйста, прокомментируйте, потому что я новичок в этом; -)

1 голос
/ 18 августа 2010

Поскольку InfoPool является одноэлементным экземпляром, я бы порекомендовал следующее:

<TextBlock x:Name="txtInfoTime" Text="{Binding Path=Time, Source={x:Static ns:InfoPool.Info}}"/>

Где ns - псевдоним xaml для пространства имен, в котором определен InfoPool. Не нужно портить свой DataContext таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...