Можно ли привязать переключатели к прикрепленному поведению в XAML?

В XAML у меня есть набор переключателей:

<RadioButton Width="25"
             Height="25"
             Foreground="Blue"
             IsChecked="{Binding ??????, Converter={StaticResource StrokeTypeConverter}, ConverterParameter="Ellipse}"
             GroupName="StrokeTypeGroup" />

Назначение каждого переключателя в StylusTypeGroup - разрешить выбор пользовательского штриха «Эллипс», «Линия» или «Прямоугольник» и т. Д.

Далее в XAML у меня есть поведение, связанное с InkCanvas, например:

  <InkCanvas x:Name="MainInkCanvas"
             Grid.Column="1"
             Grid.Row="1"
             Background="Transparent" 
             DefaultDrawingAttributes="{Binding CurrentPen.Pen}"
             EditingMode="{Binding EditingMode}">
          <i:Interaction.Behaviors>
                 <b:MainInkCanvasBehavior CustomStrokeType = "{Binding???????}" />
           </i:Interaction.Behaviors>

Есть ли способ использовать только код XAML для привязки результата проверки любого (из нескольких) переключателей напрямую к свойству зависимости CustomStrokeType объекта MainInkCanvasBehavior поведение? Или я вынужден привязаться к свойству в модели просмотра (как своего рода удерживающее свойство)?

TIA


person Alan Wayne    schedule 05.06.2017    source источник
comment
Ваш вопрос непонятен. К какому типу относится CustomStrokeType и к чему вы пытаетесь выполнить привязку?   -  person mm8    schedule 05.06.2017
comment
Привязать к логическому значению в модели просмотра, в которой реализовано изменение INotifyProperty, т. Е. public bool IsButtonAChecked {...}   -  person patrick    schedule 05.06.2017
comment
@mmi CustomStrokeType еще не определен. Мой вопрос: просто может ли переключатель быть привязан к ЛЮБОМУ свойству при поведении другого элемента.   -  person Alan Wayne    schedule 06.06.2017
comment
@Patrick Итак ... по сути, использовать модель просмотра в качестве промежуточного мессенджера ... (то есть, нет возможности напрямую привязать XAML из радиокнопок к поведению на другом элементе) ??   -  person Alan Wayne    schedule 06.06.2017
comment
@AlanWayne вы можете привязать к элементу, но вы должны спросить себя, собираетесь ли вы получать обновления через механизм изменения INotifyProperty ... например, я могу привязаться к TextBox.Text через имя элемента, путь ... но я не думаю, что я буду получать обновления.   -  person patrick    schedule 06.06.2017
comment
@Patrick Поведение может быть привязано достаточно просто: CustomStrokeType = {Binding ElementName = radiobutton, Path = IsChecked ...} Однако я не могу понять, как сделать это по-другому arround, т.е. IsChecked = {binding к поведению ...} То есть я могу привязать однозначное поведение к Radiobutton, но не многие к одному, как RadioButton к Behavior ... если вы понимаете, о чем я. :)   -  person Alan Wayne    schedule 06.06.2017
comment
@AlanWayne Вот что умеет MultiValueConverter, его много-1.   -  person patrick    schedule 06.06.2017


Ответы (1)


Наименьшее количество усилий - создать новое свойство CheckedRadioButtonID, связать его с вашим CustomStrokeType и использовать IValueConverter, чтобы взять int и вернуть Stroke. Суть в том, что при нажатии переключателя вы также хотите вызвать INotifyPropertyEvent для CheckedRadioButtonID.

   public int CheckedRadioButtonID 
    {
get 
{
  if(IsAChecked) return 1; 
/// ...
}
     // returns 1,2,3... (number of radio buttons you have)
    //  Implements INotifyPropertyChanged
    }

    public bool IsAChecked
    {
     set 
    {
     // when this is set... also raise CheckedRadioButtonID  property changed
    }
    }

В XAML выполните привязку к CheckedRadioButtonID, чтобы IValueConverter принял int и вернул Stroke.

Если вы действительно хотите использовать MultiValueConverter, вам бы это понравилось

                     <b:MainInkCanvasBehavior >
    <b:MainInkCanvasBehavior.CustomStrokeType>
    <MultiBinding Converter="{StaticResource MultiValueConverterThatReturnsStroke}">  
                        <Binding ElementName="RadioButton1" Path="IsChecked"></Binding>  
                        <Binding ElementName="RadioButton2" Path="IsChecked"></Binding>  
                    </MultiBinding>  
    </b:MainInkCanvasBehavior.CustomStrokeType>
</b:MainInkCanvasBehavior>
person patrick    schedule 05.06.2017
comment
Ага ... тот же вывод, к которому я пришел. Я бы хотел, чтобы был способ привязать несколько переключателей к одному и тому же свойству поведения непосредственно в XAML, не проходя через модель просмотра. Вы подтвердили мою мысль. Спасибо. - person Alan Wayne; 06.06.2017
comment
@AlanWayne Я добавил в свой ответ несколько элементов MultiValue - person patrick; 06.06.2017
comment
Выглядит неплохо! Раньше я не использовал такой конвертер Multibinding. Для меня это ново. Спасибо! - person Alan Wayne; 06.06.2017