none
Не работает Binding RRS feed

  • Вопрос

  • Пытаюсь в  UserControl1 прибиндить поле Width  к полю Seconds другого UserControl2.

    Width="{Binding ElementName=use2, Path=Seconds}" 
    <my:UserControl2 x:Name="use2" Margin="34,102,48,90" Height="91" Width="447" />

    public partial class UserControl2 : UserControl
        {
            public double Seconds
            {
                get { return 10.0; }
            }
        }

    Output пишет

    System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=use2'. BindingExpression:Path=Seconds; DataItem=null; target element is 'UserControl1' (Name=''); target property is 'Width' (type 'Double')

    Как это можно исправить? Вот проект




    • Изменено murad.88 21 августа 2012 г. 11:09
    21 августа 2012 г. 11:04

Ответы

  • Данная ошибка означает что у вас свойство должно быть типа DependencyProperty (http://msdn.microsoft.com/ru-ru/library/system.windows.dependencyproperty%28v=vs.100%29.aspx).

    А зачем вам такой биндинг делать? вы хотите что бы ширина контрола автоматически менялась в зависимости от контента?

    • Изменено Brash_O 21 августа 2012 г. 13:37
    • Помечено в качестве ответа Abolmasov Dmitry 24 августа 2012 г. 9:48
    21 августа 2012 г. 13:29
  • Ругается на 

    A 'Binding' cannot be set on the 'Seconds' property of type 'UserControl2'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.



    Прошу прощения, XAML выложил, а код забыл. Как правильно сказал Brash_O, обычное свойство надо заменить на Dependency. Для быстрого ввода наберите propdp и нажмите Tab. Укажите тип double, имя Second, класс Usercontrol1, значение по умолчанию 10.0
    • Помечено в качестве ответа murad.88 22 августа 2012 г. 4:55
    21 августа 2012 г. 14:34
    Отвечающий
  • Добрый день.

    У меня все билдится и запускается. Вы правильную версию выложили?

    И, да, у вас задан и Margin и Width. Лучше не использовать их в паре...

    А, да, решение вашей проблемы. Я бы здесь биндинг в обратную сторону писал. Вот так:

    <UserControl x:Class="WpfApplication2.UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:my="clr-namespace:WpfApplication2" 
                 mc:Ignorable="d" 
                
                 Height="256" Background="#FFFFBEBE"
                 x:Name="uc2"
                 >
    
        <my:UserControl2 x:Name="use2" Margin="34,102,48,90" Height="91" Width="447" Seconds="{Binding ElementName=uc2,Path=Width,Mode=OneWayToSource}" />
    
    </UserControl>

    21 августа 2012 г. 12:14
    Отвечающий

Все ответы

  • Добрый день.

    У меня все билдится и запускается. Вы правильную версию выложили?

    И, да, у вас задан и Margin и Width. Лучше не использовать их в паре...

    А, да, решение вашей проблемы. Я бы здесь биндинг в обратную сторону писал. Вот так:

    <UserControl x:Class="WpfApplication2.UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:my="clr-namespace:WpfApplication2" 
                 mc:Ignorable="d" 
                
                 Height="256" Background="#FFFFBEBE"
                 x:Name="uc2"
                 >
    
        <my:UserControl2 x:Name="use2" Margin="34,102,48,90" Height="91" Width="447" Seconds="{Binding ElementName=uc2,Path=Width,Mode=OneWayToSource}" />
    
    </UserControl>

    21 августа 2012 г. 12:14
    Отвечающий
  • автор имел ввиду то, что в  Output выводится сообщение. проект компилится
    21 августа 2012 г. 12:15
  • Странно как то у меня с таким кодом все работает

     <Grid>
            <my:UserControl1 Margin="12,34,52,38" Width="{Binding ElementName=use2, Path=Seconds}" />
            <my:UserControl2 x:Name="use2" Margin="34,102,48,90" Height="91" Width="447" />
        </Grid>
        

    Покажите каким кодом вы пытаетесь это сделать, тот который вы выложили от пустой

     <Grid>
            <my:UserControl1 Margin="12,34,52,38"/>
        </Grid>



    21 августа 2012 г. 12:16
  • Так все и должно компилироваться.

    Проблема в том что поле Width не биндится с полем Seconds.


    • Изменено murad.88 21 августа 2012 г. 13:27
    21 августа 2012 г. 12:49
  • у меня и биндинги сработали, поэтому и прошу показать ваш код
    21 августа 2012 г. 12:54
  • Добрый день.

    У меня все билдится и запускается. Вы правильную версию выложили?

    И, да, у вас задан и Margin и Width. Лучше не использовать их в паре...

    А, да, решение вашей проблемы. Я бы здесь биндинг в обратную сторону писал. Вот так:

    <UserControl x:Class="WpfApplication2.UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:my="clr-namespace:WpfApplication2" 
                 mc:Ignorable="d" 
                
                 Height="256" Background="#FFFFBEBE"
                 x:Name="uc2"
                 >
    
        <my:UserControl2 x:Name="use2" Margin="34,102,48,90" Height="91" Width="447" Seconds="{Binding ElementName=uc2,Path=Width,Mode=OneWayToSource}" />
    
    </UserControl>

    Ругается на 

    A 'Binding' cannot be set on the 'Seconds' property of type 'UserControl2'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.


    • Изменено murad.88 21 августа 2012 г. 13:23
    21 августа 2012 г. 13:23
  • Данная ошибка означает что у вас свойство должно быть типа DependencyProperty (http://msdn.microsoft.com/ru-ru/library/system.windows.dependencyproperty%28v=vs.100%29.aspx).

    А зачем вам такой биндинг делать? вы хотите что бы ширина контрола автоматически менялась в зависимости от контента?

    • Изменено Brash_O 21 августа 2012 г. 13:37
    • Помечено в качестве ответа Abolmasov Dmitry 24 августа 2012 г. 9:48
    21 августа 2012 г. 13:29
  • Ругается на 

    A 'Binding' cannot be set on the 'Seconds' property of type 'UserControl2'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.



    Прошу прощения, XAML выложил, а код забыл. Как правильно сказал Brash_O, обычное свойство надо заменить на Dependency. Для быстрого ввода наберите propdp и нажмите Tab. Укажите тип double, имя Second, класс Usercontrol1, значение по умолчанию 10.0
    • Помечено в качестве ответа murad.88 22 августа 2012 г. 4:55
    21 августа 2012 г. 14:34
    Отвечающий
  • А зачем вам такой биндинг делать? вы хотите что бы ширина контрола автоматически менялась в зависимости от контента?

    Да.
    22 августа 2012 г. 4:50
  • Тогда можно использовать свойство HorizontalContentAlignment тогда контрол 2 всегда будет иметь размеры который у родительского элемента (контрол 1) и не заморачиваться с биндингами

    <UserControl x:Class="WpfApplication2.UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:my="clr-namespace:WpfApplication2" 
                 mc:Ignorable="d" 
                
                 Height="256" Background="#FFFFBEBE"
                 x:Name="uc2" HorizontalContentAlignment=" Stretch"
                 >
    
        <my:UserControl2 x:Name="use2" Margin="34,102,48,90" Height="91"/>
    
    </UserControl>

    22 августа 2012 г. 5:15