2015-06-08 4 views
3

первую очередь - мне жаль, если это дубликат - смотрел вокруг на некоторое время и не смог найти ответ на этот вопрос,caliburn.micro связать видимость элемента с функцией ViewModel, а не свойство

Мы» re, используя caliburn.micro, поэтому решение должно использовать этот инструмент.

У нас есть представление, которое состоит из 9 кнопок, однако - не все из них будут видны в одно и то же время, это зависит от событий в системе. Каждая видимость каждой кнопки видима или свернута в зависимости от текущего состояния, но поскольку это большое количество кнопок и может увеличиться в будущем, я бы предпочел иметь одну функцию для этого (получение имени или перечисления и возврат видимости) вместо того, чтобы иметь большое количество свойств для привязки каждой кнопки.

Это еще один вариант? Кажется, я не мог найти способ сделать это обычным способом.

Поскольку события поступают из-за пределов программного обеспечения мы разрабатываем делать это на уровне представления не совсем вариант (или по крайней мере - не правильный)

Edit: Вот отрывок из посмотреть, что я хотел бы изменить:

  <Grid Margin="0"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="120" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 

       <uiviews:PhonePadView Grid.Column="0" x:Name="DestinationDn" cal:Bind.Model="UI.ViewModels.PhonePadViewModel" /> 

       <Button Grid.Column="1" Content="Dial" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="MakeCall" Visibility="{Binding btnMakeCallVisibility}" /> 
       <Button Grid.Column="1" Content="Answer" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="AnswerCall" Visibility="{Binding btnAnswerCallVisibility}" /> 
       <Button Grid.Column="1" Content="Hang-up" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="ReleaseCall" Visibility="{Binding btnReleaseCallVisibility}" /> 
       <Button Grid.Column="1" Content="Hold" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="HoldCall" Visibility="{Binding btnHoldCallVisibility}" /> 

      </Grid> 

Как вы можете видеть, мне нужно иметь разные свойства для каждой из кнопок, и я отказываюсь верить, что это единственный путь, у меня есть свойство держа текущий телефон (телефон звонит, звонит, набирает и т. д.), и на виртуальной машине легко указать, какая кнопка должна быть видимой, а какая нет, nd поверх этого у нас в настоящее время есть 9 кнопок, но он может так же легко расширяться, поэтому я ищу самый модульный код здесь

+1

ли вы рассмотреть наличие 9 экземпляров (суб-) ViewModel и построения соответствующей 1-кнопку View? –

+0

Не совсем ... Я не понимаю, ваше предложение быть честным - не могли бы вы уточнить? –

+1

Я подозреваю, что вашу проблему можно решить, разделив ее на UserControls с помощью кнопки 1. Но, не видя никакого кода, трудно быть конкретным. –

ответ

0

Итак ... в конце концов это то, что я сделал: on VM:

private HashSet<string> actionsEnabledSet = null; 
    public HashSet<string> ActionsEnabledSet 
    { 
     get { return actionsEnabledSet; } 
     set 
     { 
      actionsEnabledSet = value; 
      NotifyOfPropertyChange(() => ActionsEnabledSet); 
     } 
    } 

Наряду с изменением хешета на основе элементов, которые я хочу видеть.

A (многоканальный) преобразователь с функцией новообращенного:

public object Convert(object[] value, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     if (value[0].GetType() == typeof(HashSet<string>)) 
     { 
      if (value[1].GetType() == typeof(string)) 
      { 
       if (((HashSet<string>)value[0]).Contains((string)value[1])) 
        return Visibility.Visible; 
      } 
     } 
     return Visibility.Collapsed; 
    } 

Кнопка просмотра стиль: (Чтобы избежать дублирования кода столько, сколько я мог)

<Style TargetType="Button" x:Key="PhonePadBasicFunctionsButtons" > 
     <Setter Property="Margin" Value="0,0,0,0" /> 
     <Setter Property="Focusable" Value="False" /> 
     <Setter Property="HorizontalAlignment" Value="Stretch" /> 
     <Setter Property="Width" Value="75" /> 
     <Setter Property="Visibility"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource PhoneActionVisibilityConverter1}"> 
        <Binding Path="ActionsEnabledSet" Mode="OneWay"/> 
        <Binding RelativeSource="{RelativeSource Self}" Path="Tag" /> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style> 

И StackPanel из кнопок, выглядит следующим образом:

   <Button Content="Call" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="MakeCall" Tag="MakeCall" cal:Message.Attach="MakeCall" /> 
       <Button Content="Answer" Style="{StaticResource PhonePadBasicFunctionsButtons}" x:Name="AnswerCall" Tag="AnswerCall" cal:Message.Attach="AnswerCall" /> 

Действительно раздраженный, я не мог найти способ связать «тег» на «х: имя», но dding новые кнопки так же просто, как добавление одной строки, и лучше чувствовать код таким образом, хотел бы иметь какие-либо идеи о том, как сделать это лучше, я думаю, что это элегантно, но у меня есть ощущение, что это может быть проще чтения/реализации.

мне пришлось использовать MultiBinding как использование covnerterproperty не вариант - вы не можете связать элемент со свойством, как кажется, надеюсь, это поможет кому-то в будущем - был хороший :) Наша задача

И спасибо всем, кто пытался помочь, - вы меня вытащили из коробки и на самом деле искали ответ!

5

Из коробки, если вы назовете что-нибудь с суффиксом «IsVisible», Caliburn Micro переключит видимость.

На Вид:

<Grid Name="ConfigEditorIsVisible"> 
    <TextBlock>Test</TextBlock> 
</Grid> 

На ViewModel:

public bool ConfigEditorIsVisible { get; set; } 
Смежные вопросы