Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / [WPF C#] DependencyProperty, не передается значение / 6 сообщений из 6, страница 1 из 1
23.02.2011, 16:17
    #37132348
Cazzper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[WPF C#] DependencyProperty, не передается значение
Добрый день всем, и с наступившим 23 февраля :)

У меня возникла небольшая проблема, никак не могу решить.
Создал некий объект, унаследованный от DependencyObject, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    public class ScriptParameter : DependencyObject
    {
        public static readonly DependencyProperty NameProperty =
            DependencyProperty.Register("Name",
                                 typeof(string),
                                 typeof(ScriptParameter));
        public string Name
        {
            get { return (string)GetValue(NameProperty); }
            set { SetValue(NameProperty, value); }
        }

        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value",
                                 typeof(object),
                                 typeof(ScriptParameter));

        public object Value
        {
            get { return (object)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }
     }

Идея в том, что некоторый объект ScriptParametr представляет из себя пару name-value. Как
это используется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
               <TextBlock Grid.Row="0" Grid.Column="1" Margin="20,0" x:Name="Text24" Text="0"/>
                  ...
                        <MenuItem Header="Camera1">
                          <MenuItem.Command>
                            <hmi:ScriptCommand>
                              <hmi:ScriptCommand.Parameters>
                                <hmi:ScriptParameter Name="Text24" Value="{Binding ElementName=Text24}"/>
                              </hmi:ScriptCommand.Parameters>
                              <hmi:ScriptCommand.Script>
                                <![CDATA[
                                Text24.Text = "1";
                            ]]>
                              </hmi:ScriptCommand.Script>
                            </hmi:ScriptCommand>
                          </MenuItem.Command>
                        </MenuItem>

При запуске кода оказывается, что имя ScriptParameter.Name передается, а вот ScriptParameter.Value всегда равен NULL.

Подскажите пожалуйста где может быть ошибка. Спасибо.
...
Рейтинг: 0 / 0
23.02.2011, 16:40
    #37132381
aleks-sam
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[WPF C#] DependencyProperty, не передается значение
Value="{Binding ElementName=Text24, Path=Text}" ?
...
Рейтинг: 0 / 0
23.02.2011, 17:12
    #37132416
Cazzper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[WPF C#] DependencyProperty, не передается значение
Да, но все не так просто к сожалению. Мне нужно передать не ссылку на property объекта, а именно сам объект, чтобы затем можно было обращаться к любой его Property внутри приведенного скрипта. Именно поэтому тип Value - object.
...
Рейтинг: 0 / 0
23.02.2011, 20:54
    #37132624
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[WPF C#] DependencyProperty, не передается значение
CazzperДа, но все не так просто к сожалению. Мне нужно передать не ссылку на property объекта, а именно сам объект, чтобы затем можно было обращаться к любой его Property внутри приведенного скрипта. Именно поэтому тип Value - object.

В этом случае нужна акция со списком параметров, а это достаточно длинное кино(кода сейчас нет под рукой).Более простой вариант - MultiBinding
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 <Button Content="blablabla" 
         cal:Click.Command="{Binding MyCommand}" 					
         <cal:Click.CommandParameter>
                    <MultiBinding >
                        <MultiBinding.Bindings>
                            <Binding  Path="SelectedItem" />
                            <Binding  RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />
                        </MultiBinding.Bindings>
                    </MultiBinding>
                </cal:Click.CommandParameter>
            </Button>
...
Рейтинг: 0 / 0
23.02.2011, 22:43
    #37132723
Cazzper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[WPF C#] DependencyProperty, не передается значение
Очень интересное предложение, решил им воспользоваться.
Вот что получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
...
                 <hmi:ScriptParameterConverter x:Key="ParamConverter"/>
...
                       <MenuItem Header="Camera1">
                          <MenuItem.CommandParameter>
                            <MultiBinding Converter="{StaticResource ParamConverter}">
                              <Binding ElementName="Text24"/>
                              <Binding ElementName="Text241"/>
                            </MultiBinding>
                          </MenuItem.CommandParameter>
                          <MenuItem.Command>
                            <hmi:ScriptCommand>
                              <hmi:ScriptCommand.Script>
                                <![CDATA[
                                Param_0.Text = "1";
                            ]]>
                              </hmi:ScriptCommand.Script>
                            </hmi:ScriptCommand>
                          </MenuItem.Command>
                        </MenuItem>
 
И описание конвертера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   public class ScriptParameterConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Dictionary<string, object> scopeVars = new Dictionary<string, object>();
            for (int i = 0; i < values.Count(); i++)
            {
                scopeVars["Param_" + i.ToString()] = values[i];
            }
            return scopeVars;

        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

При этом в object[] values я теперь получаю массив из DependencyProperty.UnsetValue, что в общем равносильно предыдущему результату :(

При этом такая простая проверка в этом же коде как, как:
Код: plaintext
1.
2.
                <TextBlock Grid.Row="0" Grid.Column="1" Margin="20,0" x:Name="Text24" Text="0"/>
                <TextBlock Grid.Row="0" Grid.Column="1" Margin="40,0" x:Name="Text241" Text="{Binding ElementName=Text24}"/>

Вполне себе работает, то есть в тексте второго блока появляется: "System.Windows.Controls.TextBlock".
...
Рейтинг: 0 / 0
27.02.2011, 23:37
    #37138621
Cazzper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[WPF C#] DependencyProperty, не передается значение
В общем так и не понял, что это было, но чтобы закончить тему приведу аналогичный, но работающий код для кнопки.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
...
                  <hmi:ScriptParameterConverter x:Key="ParamConverter"/>
...
                <Button Grid.Row="0" Grid.Column="1" Margin="100,0,100,100">
                  <Button.CommandParameter>
                    <MultiBinding Converter="{StaticResource ParamConverter}">
                      <Binding ElementName="Text24"/>
                      <Binding ElementName="Text241"/>
                    </MultiBinding>
                  </Button.CommandParameter>
                  <Button.Command>
                    <hmi:ScriptCommand>
                      <hmi:ScriptCommand.Script>
                           <![CDATA[
                                Text24.Text="2"
                            ]]>
                      </hmi:ScriptCommand.Script>
                    </hmi:ScriptCommand>
                  </Button.Command>
                </Button>

И кстати крайне неудобным оказалось отсутствие возможности задавать Binding для MultiBinding.ConverterParameter.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / [WPF C#] DependencyProperty, не передается значение / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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