2014-12-28 2 views
0

У меня есть 2 переключателя, ограниченные XML через XPath. Если я выберу первый переключатель, мне нужно будет получить выбранное значение поля со списком и установить его в XML-элемент. Однако, если я выберу второй переключатель, мне просто нужно установить фиксированное твердое значение.Получение значения другого элемента управления в конвертере

У меня возникли проблемы с получением значения из поля со списком, когда я выбираю первый переключатель. Я пробовал использовать ConverterParameter (и я выяснил, что он не позволяет привязки), и использование MultiBinding тоже не помогло.

Прошу совета.

Спасибо!

+0

Где находится ваш xaml? –

ответ

0

Вы были на правильном пути с MultiBinding и MultiValueConverter. Вот простой пример того, что-то похожее на ваши потребности:

<Window.Resources> 
    <my:MyMultiValueConverter x:Key="MyMultiValueConverter" /> 
</Window.Resources> 

<StackPanel Orientation="Vertical" > 
    <RadioButton x:Name="FirstRadioButton" GroupName="MyButtonGroup">First</RadioButton> 
    <RadioButton x:Name="SecondRadioButton" GroupName="MyButtonGroup">Second</RadioButton> 
    <ComboBox x:Name="MyComboBox" SelectedValuePath="Content"> 
     <ComboBoxItem>First Item</ComboBoxItem> 
     <ComboBoxItem>Second Item</ComboBoxItem> 
    </ComboBox> 

    <TextBlock> 
     <TextBlock.Text> 
      <MultiBinding Converter="{StaticResource MyMultiValueConverter}"> 
       <Binding ElementName="FirstRadioButton" Path="IsChecked" /> 
       <Binding ElementName="MyComboBox" Path="SelectedValue" /> 
      </MultiBinding> 
     </TextBlock.Text> 
    </TextBlock> 
</StackPanel> 

и конвертер:

class MyMultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var firstRadioButtonValue = (bool)values[0]; 
     var comboBoxSelectedValue = values[1]; 

     return firstRadioButtonValue ? comboBoxSelectedValue : "MyStaticValue"; 
    } 

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

Edit:

Если вам нужно только реагировать на Checked случае RadioButton (ов), то вы можете пойти примерно с чем-то вроде этого:

<Window.DataContext> 
    <my:MainWindowViewModel /> 
</Window.DataContext> 

<StackPanel Orientation="Vertical"> 
    <RadioButton GroupName="MyButtonGroup" Content="First" IsChecked="True"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Checked"> 
       <i:InvokeCommandAction Command="{Binding PassSelectedValueToXmlCommand}" CommandParameter="{Binding SelectedValue, ElementName=MyComboBox}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </RadioButton> 
    <RadioButton GroupName="MyButtonGroup" Content="Second"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Checked"> 
       <i:InvokeCommandAction Command="{Binding PassSelectedValueToXmlCommand}" CommandParameter="My static value" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </RadioButton> 
    <ComboBox x:Name="MyComboBox" SelectedValuePath="Content"> 
     <ComboBoxItem Content="First item" IsSelected="True" /> 
     <ComboBoxItem Content="Second Item" /> 
    </ComboBox> 
</StackPanel> 

Примечание: вам необходимо ссылаться на System.Windows.Interactivity и использовать его в окне/странице/контроле ... xmlns: i = "http://schemas.microsoft.com/expression/2010/interactivity"

вы можете справиться с этим в ViewModel:

public MainWindowViewModel() 
    { 
     PassSelectedValueToXmlCommand = new DelegateCommand<string>(HandleCommand); 
    } 

    public ICommand PassSelectedValueToXmlCommand { get; set; } 

    private void HandleCommand(string parameter) 
    { 
     MessageBox.Show(String.Format("Parameter with value {0} was received by ViewModel", parameter)); 
    } 

Вам не нужно даже конвертер для такого случая, но вы не будете обрабатывать выбор ComboBox изменен таким образом. Если вам это тоже нужно, вы можете «сохранить» привязанные значения к скрытому тегу TextBlock.Tag или StackPanel или что-то подобное. Я уверен, вы можете понять это сейчас.

+0

Hi Janez, я сделал что-то подобное, но проблема в ConvertBack. Я делаю multiBinding на моем RadioButton.IsChecked. Итак, теперь, когда я выбираю этот радиобуй, мне нужно захватить значение combobox и передать его моему XML, что происходит в ConvertBack :) –

Смежные вопросы