powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding UserControl не работает
44 сообщений из 44, показаны все 2 страниц
Binding UserControl не работает
    #37055856
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток. Есть вопрос к знатокам.
Есть юзер контрол:

Код: plaintext
    public partial class CueControl : UserControl\n    {\n        public static readonly DependencyProperty CurrentCueCountProperty =\n            DependencyProperty.Register("CurrentCueCount", typeof(int), typeof(CueControl), new PropertyMetadata(0, OnMyPropertyChanged));\n\n        public  int CurrentCueCount\n        {\n            get { return (int)GetValue(CurrentCueCountProperty); }\n            set \n            {\n                SetValue(CurrentCueCountProperty, value);\n            }\n        }\n\n        private static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\n        {\n            CueControl control = d as CueControl;\n            if (control == null)\n            {\n                return;\n            }\n    \n            control.UpdateLayout();\n\n        }\n...

В XAML в DataTemplate есть привязка такого рода:
Код: plaintext
<cueselector:CueControl x:Name="cuecontrol" CurrentCueCount="{Binding CueCount, Mode=TwoWay}" />

Так вот вопрос, я должен менять в юзерконтроле значение, а оно в свою очередь лолжно писаться в CueCount. Но не пишется!
А если написать так:
Код: plaintext
<TextBox x:Name="tb" Text="{Binding CueCount}" />
то работает. Как сделать то привязку?
Тут смотрел, но че то не догнал. На пальцах мож кто объяснит.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37055864
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ссылка на аналогичную проблему. Какой DataContext нах там еще...
У меня DataTemplate натягивается на элемент коллекции которую в свою очередь привязываю через ItemsSource
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37055971
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks-sam,

покажите XAML разметку этого контрола, и еще того, где он используется
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37055989
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контрол:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<UserControl x:Class="CueSelectorControl.CueControl"
             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">
    <UserControl.Resources >

... Ресурсы контрола ...
</UserControl.Resources>
        <Grid x:Name="LayoutRoot">
        ... Тело контрола ...
    </Grid>
    
</UserControl>

Где используется:

Код: plaintext
1.
2.
3.
4.
5.
        <DataTemplate x:Key="DefaultDataTemplate">
            <Border Width="240" Height="270">
                  <cueselector:CueControl x:Name="cuecontrol" CurrentCueCount="{Binding CueCount, Mode=TwoWay}"/>
            </Border>
        </DataTemplate>

Этот DataTemplate натягивается на элемент списка (ListBox)
И списку назначается коллекция (List<xxxx>) через ItemsSource, где xxxx это класс в котором есть поле:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        private int _cueCount;
        public int CueCount
        {
            get { return _cueCount; }
            set 
            {
                _cueCount = value;
                OnPropertyChanged(new PropertyChangedEventArgs("CueCount"));
            }
        }
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056001
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks-sam,

в этом UserControl нигде не указывается никаких объектов для DataContext?
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056042
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikhaleks-sam,

в этом UserControl нигде не указывается никаких объектов для DataContext?
Нет. А надо?
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056046
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто не понял коллегу (ссылку в первом топике приводил), он там говорил про это. Не знаю куда прикрутить надо.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056103
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks-sam,

вот я написал пример того, что вы мне рассказали, у меня все отлично работает, смотрите в output window при запуске с отладчиком. смотрите чем ваш пример отличается. по поводу приведенного кода, вы бы мне еще xaml UserControl могли бы уж просто привести <UserControl ... > ... </UserControl>, что уж лишнее-то писать. ;)
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056114
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikhaleks-sam,

вот я написал пример того, что вы мне рассказали, у меня все отлично работает, смотрите в output window при запуске с отладчиком. смотрите чем ваш пример отличается. по поводу приведенного кода, вы бы мне еще xaml UserControl могли бы уж просто привести <UserControl ... > ... </UserControl>, что уж лишнее-то писать. ;)
Да в теле контрола не важно же что там. Там просто еще 2 кнопки и текстовое поле. Никаких привязок, ничего нет больше.
За пример спасибо. Ща посмотрю.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056234
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        private int _cueCount;
        public int CueCount
        {
            get { return _cueCount; }
            set 
            {
                _cueCount = value;
                PropertyChanged(this, new PropertyChangedEventArgs("CueCount"));
            }
        }}

У меня в проге не вызывается метод SET.

Вопрос:
Вот ты делаешь так:
<Window.DataContext>
<WpfApplication2:ViewModel />
</Window.DataContext>

И потом привязываешься:
<ListBox ItemsSource="{Binding Items}" >

У меня список в этом же окне, как мне в DataContext указать текущее окно или объект?
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056280
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks-sam,

еще раз, покажите весь код xaml где вы используете этот UserControl, а так же код xaml самого UserControl
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056313
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это контрол где используется тот злополучный контрол (Контрол в контроле :) ) :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
<UserControl x:Class="Billiards.TablesSurface"
             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:ei="http://schemas.microsoft.com/expression/2010/interactions"
             xmlns:ee="http://schemas.microsoft.com/expression/2010/effects"
             xmlns:local="clr-namespace:Billiards"
             xmlns:cueselector="clr-namespace:CueSelectorControl;assembly=CueSelectorControl"
             mc:Ignorable="d" 
             d:DesignHeight="600" d:DesignWidth="800" Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded">

    <UserControl.Resources>


        <DataTemplate x:Key="DefaultDataTemplate">
            <Border Width="240" Height="270" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Padding="4" Margin="3" Background="#FF293955" CornerRadius="5" BorderBrush="#FF000000" BorderThickness="2">
                <Border VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Padding="4" Background="#FFFFFFFF" CornerRadius="5" BorderBrush="#FF000000" BorderThickness="0">
                    <Border VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Padding="4" Background="#FF293955" CornerRadius="5" BorderBrush="#FF000000" BorderThickness="0">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="auto"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="auto" />
                            </Grid.RowDefinitions>

                            <StackPanel Orientation="Vertical" Grid.Column="1">
                                <Button x:Name="btnshield" Click="btnshield_Click" ToolTipOpening="tooltshield_ToolTipOpening" Content="" Height="35" Style="{DynamicResource ButtonStyleShield}" Width="28" Margin="20,0,0,0">
                                    <Button.ToolTip>
                                        <TextBlock/>
                                    </Button.ToolTip>
                                </Button>
                                <Button x:Name="btn_note" Click="btn_note_Click" Content="" HorizontalAlignment="Right" Style="{DynamicResource ButtonStyleNote}" Width="28" Margin="0,20,0,0"/>
                                <!--<TextBox x:Name="tb" Width="50" Text="{Binding CueCount}" />-->
                                <cueselector:CueControl x:Name="cuecontrol" CurrentCueCount="{Binding CueCount, Mode=TwoWay}"  HorizontalAlignment="Right" Margin="0,20,0,0" />
                            </StackPanel>
                            
                            <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
                                <StackPanel Orientation="Horizontal">
                                    <ToggleButton Content="ToggleButton" IsChecked="{Binding Isstarted}" IsEnabled="False" HorizontalAlignment="Left" Height="30" Style="{DynamicResource ToggleButtonStyleBilliards}" VerticalAlignment="Center" Width="30"/>
                                    <TextBlock Text="{Binding Playtablename}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" FontSize="27" FontWeight="Bold" FontFamily="Buxton Sketch" />
                                </StackPanel>
                                
                               
                                <TextBlock Text="{Binding Tablegamename}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" FontSize="15" FontWeight="Medium" FontFamily="Buxton Sketch" />
                                <!--<Image Source="/Billiards;component/Images/bili.jpg" />-->
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding GameTypeLabel}" Foreground="White" VerticalAlignment="Center"/>
                                    <TextBlock Text="{Binding Timecontent}" Foreground="{Binding Labelbrush}" FontSize="32" FontWeight="Bold" FontFamily="Quartz MS"/>
                                </StackPanel>

                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="Начало: " Foreground="White"/>
                                    <TextBlock Text="{Binding StartDateLabel, StringFormat='ddd, HH:mm', ConverterCulture='ru-RU'}" Foreground="White"/>
                                </StackPanel>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="Конец: " Foreground="White"/>
                                    <TextBlock Text="{Binding StopDate, StringFormat='ddd, HH:mm', ConverterCulture='ru-RU'}" Foreground="White"/>
                                </StackPanel>

                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="Затрачено денег: " Foreground="White"/>
                                    <TextBlock Text="{Binding Moneycount, StringFormat='c', ConverterCulture='ru-RU'}" Foreground="White" />
                                </StackPanel>

                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="Игра: " Foreground="White"/>
                                    <TextBlock Text="{Binding Gamestatuslabel}" Foreground="White" />
                                </StackPanel>
                            </StackPanel>
                            <Button Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Content="{Binding Btncaption, Mode=TwoWay}" Style="{DynamicResource ButtonStyleBilliards}" Width="180" Height="35" FontSize="20" FontWeight="Bold" Foreground="{Binding Btnbrush}" Tag="{Binding Id}" Click="Button_Click" Margin="0,0,0,5" />
                        </Grid>
                    </Border>
                </Border>
            </Border>
        </DataTemplate>

        <DataTemplate x:Key="OrderDataTemplate">
            <Border Width="240" Height="230" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Padding="4" Margin="10" Background="#FF293955" CornerRadius="5" BorderBrush="#FF000000" BorderThickness="2">
                <Border VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Padding="4" Background="#FFFFFFFF" CornerRadius="5" BorderBrush="#FF000000" BorderThickness="0">
                    <Border VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Padding="4" Background="#FF293955" CornerRadius="5" BorderBrush="#FF000000" BorderThickness="0">
                        <Grid>
                            <StackPanel Orientation="Vertical">

                                <TextBlock Text="Забронирован" FontSize="24" TextDecorations="Underline" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,10">
									<TextBlock.Foreground>
										<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
											<GradientStop Color="White" Offset="0"/>
											<GradientStop Color="White" Offset="1"/>
											<GradientStop Color="#FFD44A4A" Offset="0.482"/>
										</LinearGradientBrush>
									</TextBlock.Foreground>
                                </TextBlock>

                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="2*" />
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Text="ФИО:" HorizontalAlignment="Right" Foreground="White" VerticalAlignment="Center" />
                                    <TextBlock Text="{Binding OrderUser}" HorizontalAlignment="Stretch" Grid.Column="1" Foreground="White"/>
                                </Grid>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="2*" />
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Text="№ карты:" HorizontalAlignment="Right" Foreground="White" VerticalAlignment="Center" />
                                    <TextBlock Text="{Binding OrderCard}" HorizontalAlignment="Stretch" Grid.Column="1" Foreground="White"/>
                                </Grid>

                                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,50,0,0">
                                    <Button x:Name="btnorder_start" Content="{Binding Btncaption, Mode=TwoWay}" Style="{DynamicResource ButtonStyleSmallBtn}" FontWeight="Bold" Width="80.021" Foreground="{Binding Btnbrush}" Tag="{Binding Id}" Click="btnorder_start_Click" Margin="0,0,10,0" />
                                    <Button x:Name="btnorder_cancel" Content="Снять" Style="{DynamicResource ButtonStyleSmallBtn}" Width="80.021" FontWeight="Bold" Foreground="White" Click="btnorder_cancel_Click"  Margin="10,0,0,0" />
                                </StackPanel>
                            </StackPanel>
                        </Grid>
                    </Border>
                </Border>
            </Border>
        </DataTemplate>

        <local:TableTemplateSelector x:Key="myselector"
            DefaultTemplate="{StaticResource DefaultDataTemplate}"
            OrderTemplate="{StaticResource OrderDataTemplate}" />

        <Style x:Key="SimpleListBoxItem" TargetType="ListBoxItem">
            <Setter Property="FocusVisualStyle" Value="{x:Null}" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Border 
                           Name="Border"
                           Padding="2"
                           SnapsToDevicePixels="true">
                            <ContentPresenter />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    </UserControl.Resources>

    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
                <ListBox Name="Tablelist"
	                    IsSynchronizedWithCurrentItem="True" 
	                    ItemsSource="{Binding Items}"
	                    ItemContainerStyle="{DynamicResource SimpleListBoxItem}"
                        ItemTemplateSelector="{StaticResource myselector}"
	                    ScrollViewer.VerticalScrollBarVisibility="Disabled"
                        
	                    >
                <ListBox.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#AA004886" Offset="0" />
                        <GradientStop Color="#AAFFFFFF" Offset="1" />
                    </LinearGradientBrush>
                </ListBox.Background>
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel IsItemsHost="True" 
	                        Orientation="Horizontal"
	                                                Width="{Binding 
	                          Path=ActualWidth,
	                          RelativeSource={RelativeSource 
	                              Mode=FindAncestor, 
	                              AncestorType=
	                                 {x:Type ScrollContentPresenter}}}" />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
        </ScrollViewer>
    </Grid>
</UserControl>

По событию загрузки этого контрола вызывается метод:

Код: plaintext
1.
2.
3.
4.
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
            tables = GlobalVariables.remote.GetTables();
            Tablelist.ItemsSource = tables;
}


**********

Сам контрол:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<UserControl x:Class="CueSelectorControl.CueControl"
             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">
        <Grid x:Name="LayoutRoot">
        <Border Width="28" Height="86" Background="#FF7F8A93" CornerRadius="5">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>

                <Button x:Name="btnUp" Click="btnUp_Click" Grid.Row="0" Content="" Margin="0" Height="26" Style="{DynamicResource ButtonStyleArrowUp}" Width="26"/>
                <Button x:Name="btnDown" Click="btnDown_Click" Grid.Row="2" Content="" Margin="0" Height="26" Style="{DynamicResource ButtonStyleArrowDown}" Width="26"/>
                <TextBlock x:Name="tbCueCount" Grid.Row="1" Text="0" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="21.333" FontWeight="Bold" Foreground="White" />

            </Grid>
        </Border>
    </Grid>

И его код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
namespace CueSelectorControl
{
    public partial class CueControl : UserControl
    {
        public static readonly DependencyProperty CurrentCueCountProperty =
            DependencyProperty.Register("CurrentCueCount", typeof(int), typeof(CueControl), new PropertyMetadata(0, OnMyPropertyChanged));

        public  int CurrentCueCount
        {
            get { return (int)GetValue(CurrentCueCountProperty); }
            set 
            {
                SetValue(CurrentCueCountProperty, value);
            }
        }

        private static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            CueControl control = d as CueControl;
            if (control == null)
            {
                return;
            }
    
            control.UpdateLayout();
        }

        public CueControl()
        {
            InitializeComponent();
            CurrentCueCount = 0;
        }

        private void btnUp_Click(object sender, RoutedEventArgs e)
        {
            CurrentCueCount++;
            tbCueCount.Text = CurrentCueCount.ToString();
        }

        private void btnDown_Click(object sender, RoutedEventArgs e)
        {
            if (CurrentCueCount > 0)
            {
                CurrentCueCount--;
                tbCueCount.Text = CurrentCueCount.ToString();
            }
        }
    }
}

******
tables - переменная типа ObserbableCollection<PlayTable>, где PlayTable:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class PlayTable : INotifyPropertyChanged
{
        private int _cueCount;
        public int CueCount
        {
            get { return _cueCount; }
            set 
            {
                _cueCount = value;
                //OnPropertyChanged(new PropertyChangedEventArgs("CueCount"));
                PropertyChanged(this, new PropertyChangedEventArgs("CueCount"));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged = delegate { };
        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, e);
        }
}
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056378
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks-sam,

уберите из конструктора CurrentCueCount = 0; все равно в объявлении DependencyProperty это уже проставлено. А вот почему не работает когда в конструкторе стоит CurrentCueCount = 0 я не могу ответить, надо покопать.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056398
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikhaleks-sam,

уберите из конструктора CurrentCueCount = 0; все равно в объявлении DependencyProperty это уже проставлено. А вот почему не работает когда в конструкторе стоит CurrentCueCount = 0 я не могу ответить, надо покопать.
бл?*:!, убрал CurrentCueCount = 0 в конструкторе и биндинг заработал.
Что это хначит?
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056423
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks-samбл?*:!, убрал CurrentCueCount = 0 в конструкторе и биндинг заработал.
Что это хначит?Значит, что binding заменялся на 0.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056446
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Кaleks-samбл?*:!, убрал CurrentCueCount = 0 в конструкторе и биндинг заработал.
Что это хначит?Значит, что binding заменялся на 0.
че??? а в методах btnDown_Click и btnUp_Click чего же не заменяется на 0?

Думаю это баг WPF, надо бы создать багрепорт на connect.microsoft.com, если ни у кого желания его создавать нет, то я создам потом как время будет.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056455
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis GladkikhАлексей Кпропущено...
Значит, что binding заменялся на 0.
че??? а в методах btnDown_Click и btnUp_Click чего же не заменяется на 0?

Думаю это баг WPF, надо бы создать багрепорт на connect.microsoft.com, если ни у кого желания его создавать нет, то я создам потом как время будет.Binding является одним из типов значений DependencyProperty. Если я правильно понял, произошло что-то вроде:
Код: plaintext
1.
2.
3.
myTextBox.SetBinding(TextBox.TextProperty, new Binding("SomeProperty"));
myTextBox.Text = "bla bla bla"; // тут Binding убивается и значением свойства становится указанное значение.

...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056485
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сам в шоке. Может и Алексей и прав. Блин, дела...
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056486
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikhче??? а в методах btnDown_Click и btnUp_Click чего же не заменяется на 0?Там нет присваивания этому свойству 0.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056523
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, чё-то я не то ляпнул. Как же тогда TwoWay Binding будет работать. :-)

Сори.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056542
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что тогда в конструкторе происходит тогда с CurrentCueCount = 0?
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056570
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis GladkikhДумаю это баг WPF
)))
читать о том как определяется значение DependencyProperty
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056593
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks-samНу что тогда в конструкторе происходит тогда с CurrentCueCount = 0?Ну может правда какая ошибка/особенность, связанная с тем, что свойству с Binding-гом было "не вовремя" :-) присвоено значение. Такой пример вроде нормально работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
WPF4

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Slider Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="slider1" VerticalAlignment="Top" Width="479" 
                Value="{Binding Value, ElementName=progressBar1, Mode=TwoWay}"/>
        <ProgressBar Height="21" HorizontalAlignment="Left" Margin="12,52,0,0" Name="progressBar1" VerticalAlignment="Top" Width="479" Maximum="10" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,79,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            slider1.Value = 0;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            slider1.Value = 5;
        }
    }

Возможно именно в Вашем случае сказалась какая-то особенность.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056609
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну у меня такая вот ситуация :)
Буде время проверю времена инициализации.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056658
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, ну что вы в самом деле, читайте доку - Dependency Property Value Precedence
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056678
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

в смысле, ты объясняешь этой статьей в чем проблема, если в конструкторе установить 0 для DependencyProperty текущего UserControl?
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37056732
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikh,

да, оттуда
Dynamic resources and bindings have the precedence of where they were set, but the value is deferred. One consequence of this is that if you set a dynamic resource or binding to a local value, any change to the local value replaces the dynamic resource or binding entirely. Even if you call the ClearValue method to clear the locally set value, the dynamic resource or binding will not be restored. In fact, if you call ClearValue on a property that has a dynamic resource or binding in place (with no literal local value), they are cleared by the ClearValue call too.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37057155
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, для случая когда необходимо задать текущее значение DP, не нарушая связь с источником, существует метод SetCurrentValue, т.е. в конструкторе примера будет так:
Код: plaintext
1.
//CurrentCueCount = 0;
SetCurrentValue(CurrentCueCountProperty, 0);
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37057198
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

спасибо, что-то я как-то на это даже и не напарывался и не знал про это. бывает.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37057369
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Gladkikh,

DO/DP для меня ооочень нетривиальная вещь (и по большей части остается "terra incognita"), но одно я уяснил четко - (существенных) багов там быть не может, ибо это один из столпов wpf :)

Алексей КТакой пример вроде нормально работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
........
        public MainWindow()
        {
            InitializeComponent();
            slider1.Value = 0;
        }
........

если вместо slider1.Value = 0; попытаемся явно дернуть slider1.SetValue(Slider.ValueProperty, 0); то получим ошибку ('0' is not a valid value for property 'Value'.)
а вот slider1.ClearValue(Slider.ValueProperty); разрушает байндинг...
х.з., очевидно, особенность реализации этих (DP) свойств у контролов?
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37057440
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRявно дернуть slider1.SetValue(Slider.ValueProperty, 0); то получим ошибку ('0' is not a valid value for property 'Value'.)
хе-хе, так проходит slider1.SetValue(Slider.ValueProperty, 0d);
но байндинг это не разрушает...
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37057460
Denis Gladkikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

а код спрятан :( не рефлектор не показывает, ни продебажить нельзя...
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37057516
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вполне возможно это вот этот случай:

Dependency Property Value Precedence
Coercion, Animations, and Base Value
Coercion applies at the highest level of all. Even an already running animation is subject to value coercion. Certain existing dependency properties in WPF have built-in coercion. For a custom dependency property, you define the coercion behavior for a custom dependency property by writing a CoerceValueCallback and passing the callback as part of metadata when you create the property. You can also override coercion behavior of existing properties by overriding the metadata on that property in a derived class. Coercion interacts with the base value in such a way that the constraints on coercion are applied as those constraints exist at the time, but the base value is still retained. Therefore, if constraints in coercion are later lifted, the coercion will return the closest value possible to that base value, and potentially the coercion influence on a property will cease as soon as all constraints are lifted. For more information about coercion behavior, see Dependency Property Callbacks and Validation.

т.е., DP механизм весьма и весьма нетривиален...:)
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37058143
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я тоже никогда не обращал внимания, пока вот не эта ситуация. Спасибо за дискуссию и помощь.


expirience++;
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37058174
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRесли вместо slider1.Value = 0; попытаемся явно дернуть slider1.SetValue(Slider.ValueProperty, 0); то получим ошибку ('0' is not a valid value for property 'Value'.)Потому что свойство имеет тип double, а Вы пытаетесь присвоить int. А при обращении к типизированному сеттеру происходит неявное преобразование типа.
LRа вот slider1.ClearValue(Slider.ValueProperty); разрушает байндинг...Всё верно. Именно "это" вызывается внутри BindingOperations.ClearBinding.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37058938
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRLRявно дернуть slider1.SetValue(Slider.ValueProperty, 0); то получим ошибку ('0' is not a valid value for property 'Value'.)
хе-хе, так проходит slider1.SetValue(Slider.ValueProperty, 0d);
но байндинг это не разрушает...

Похожая ситуация:
Код: plaintext
1.
2.
        public static readonly DependencyProperty CurrentCueCountProperty =
            DependencyProperty.Register("CurrentCueCount", typeof(double), typeof(CueControl), new PropertyMetadata(0, OnMyPropertyChanged));

Выдаст исключение (или нет, не помню, в любом случае привязка развалится). А если так:

Код: plaintext
1.
2.
        public static readonly DependencyProperty CurrentCueCountProperty =
            DependencyProperty.Register("CurrentCueCount", typeof(int), typeof(CueControl), new PropertyMetadata(0d, OnMyPropertyChanged));
То все будет нормально.
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37058941
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюки,
Код: plaintext
1.
2.
        public static readonly DependencyProperty CurrentCueCountProperty =
            DependencyProperty.Register("CurrentCueCount", typeof(double), typeof(CueControl), new PropertyMetadata(0d, OnMyPropertyChanged));
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37059131
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюки,

> Выдаст исключение (или нет, не помню, в любом случае привязка развалится)
если можно привести к нужному типу, то ошибки не будет (да и привязка не развалится, с чего?), все согласно msdn (PropertyMetadata Constructor):
The type of the value provided for defaultValue must be match or be related to the type specified in the original registration of the dependency property that this metadata will be applied to.

для DependencyObject.SetValue тоже все происходит согласно msdn:
If the provided type does not match the type that is declared for the dependency property as it was originally registered, an exception is thrown. The value parameter should always be provided as the appropriate type.

а вот в обвертке-сеттере свойства вероятно осуществляется попытка приведения типа...


Остается неясным вопрос, почему для "самописного" DO присвоение локального значения DP убивает привязку, а для тех же контролов из примера Алексей К этого не происходит...
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37059315
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

Видимо double и int не являются be related .
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37059439
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руки-крюки,

да, действительно )))
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37059832
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если (в примере, который выложил Denis Gladkikh) CueControl захостить вне списка (и DataTemplate), например
Код: plaintext
1.
2.
... 	</ListBox>
        <WpfApplication2:CueControl CurrentCueCount="{Binding Items.Count}"...
то никаких проблем с нарушением привязки при присвоении значения в конструкторе не возникает.
с другой стороны, если отнаследоваться от какого-нить библиотечного контрола, напр.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    public class MyTextBox : TextBox
    {
        public MyTextBox()
            : base()
        {
            this.TextChanged += new TextChangedEventHandler(MyTextBox_TextChanged);
            //Text = "zero";
        }
        void MyTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            BindingExpression be = GetBindingExpression(TextBox.TextProperty);
            Debug.WriteLine(string.Format("MyTextBox Text is {0}, Binding DataItem is {1}", Text, be != null ? be.DataItem : "null"));
        }
    }
и засунуть его в ListBox подобно CueControl, получим ту же проблему что и с CueControl, т.е. мысль об "особая реализации" DP в контролах оказалась несостоятельной )) думаю, копать надо куда-то в сторону ListBox.ItemTemplate либо байндинга коллекций...

так что, Denis Gladkikh, это
Denis GladkikhДумаю это баг WPF вполне может иметь место :-)
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37059886
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, наконец-то :-) нагуглил обсуждение этой проблемы с очень правдоподобным объяснением:
hbarckI would guess that if you initialize the property with a local value before the template-generated binding is in place, this value takes precedence over values set through a binding in a DataTemplate, as stated in the document I linked above. If you create a binding in XAML directly, this has the same precedence as the local value, so it overwrites it. If you initialize the value after the binding has been created by the DataTemplate, setting the property is already propagated through the binding, so you don't notice the difference...
что не противоречит документации (Dependency Property Value Precedence), так что это таки не баг WPF, пфрруу
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37066373
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как глубока истина все же
...
Рейтинг: 0 / 0
Binding UserControl не работает
    #37072056
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня почему-то вот так рушится привязка.
Код: plaintext
1.
2.
3.
4.
5.
6.
        private void MessageBorder_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (ignoreEvent) return;
            ignoreEvent = true;
            MessageBorder.SetValue(Border.VisibilityProperty, Visibility.Visible);
            ignoreEvent = false;
        }
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding UserControl не работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]