2009-04-21 2 views
0

В Silverlight 2 ....Silverlight 2 динамические привязки данных конвертер

У меня есть RadioButton в моем XAML коде следующим образом:

<RadioButton GroupName="Gender" Content="Male" IsChecked="{Binding Path=Gender, ConverterParameter=1, Mode=TwoWay, Converter={StaticResource RadioStringConverter}}" Width="49" HorizontalAlignment="Left"/> 

Это прекрасно работает. Моя проблема заключается в том, чтобы динамически дублировать эту функциональность.

RadioButton rb = new RadioButton() {GroupName = "Gender", Content = "Male" ,Width = (double)49,HorizontalAlignment = System.Windows.HorizontalAlignment.Left}; 

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

Вот что я пытался ....

RadioButton rb = new RadioButton() {GroupName = "Gender", Content = "Male" ,Width = (double)49,HorizontalAlignment = System.Windows.HorizontalAlignment.Left}; 

RadioStringConverter rsc = new RadioStringConverter(); 

Binding binding = new Binding(layout.FieldName) { Source = mainLayout.DataContext, Mode = BindingMode.TwoWay,ConverterParameter = 1,Converter = rsc}; // to emulate the "{StaticResource RadioStringConverter}"}; 

rb.SetBinding(RadioButton.IsCheckedProperty, binding); 

sp.Children.Add(rb); 

Хотя это нормально компилируется, он не работает правильно. 1) Как динамически ссылаться на статический ресурс? 2) Как добавить этот статический ресурс в XAML динамически? Прямо сейчас у меня эта ссылка жестко закодирована.

Я делаю это более сложным, чем это должно быть?

ответ

2

Решение найдено .... В основном я должен был создать экземпляр класса преобразователя и передать его интерфейс к преобразователю, как например:

Binding binding = new Binding(layout.FieldName) { Source = mainLayout.DataContext, Mode = BindingMode.TwoWay,ConverterParameter = 1,Converter = (rsc as IValueConverter)}; 

Рад, что получилось просто и выполнимо :)

0

Хотя возможно, как вы узнали, вы уверены, что хотите динамически создавать RadioButton?

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

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

На самом деле, после того, как я обнаружил MVVM, я полностью исключил необходимость в преобразователях данных на уровне пользовательского интерфейса. Преобразователи данных устарели с помощью MVVM :)

+0

Можете ли вы подробнее рассказать о MVVM, а также о динамических контейнерах? Я бы хотел увидеть некоторые небольшие образцы на вашем подходе к этому! – JLewis

+0

Итак, вы можете найти много информации в Интернете о MVVM (Model-View-ViewModel) ... просто найдите его. Это по существу делает XAML слоем поверх всего остального и устраняет все (большинство) вашего кода. Ваш ViewModel реализует INotifyPropertyChanged и представляет собой представление пользовательского интерфейса (свойства для видимости, включено, данные, команды и т. Д.). В этом случае вы создаете модель представления, в которой есть все, что вам нужно ... bool для выбранного состояния, текст, возможно, перечисление для группы и т. Д. Затем небольшой пользовательский элемент управления, который привязывается к ViewModel. –

+0

@Brian Genisio Это такое большое утверждение: преобразователи данных устарели с MVVM. Я получил различные элементы управления, привязанные к одному объекту. Вместо того, чтобы создавать различные поля, являющиеся своего рода представлением этого объекта и используя несколько PropertyChangedEvents, я запускаю одно событие и позволяю конвертерам выполнять свою работу, чтобы отобразить его как изображение, текст,% и bool. Не могли бы вы сказать свой подход к такой ситуации, без конвертеров. Потому что есть шанс, что я совершенно не слышу. –