我有2个单选按钮,通过XPath绑定到XML。如果我选择第一个单选按钮,我将需要获取组合框的选定值,并将其设置为XML元素。但是,如果我选择第二个单选按钮,我只需要设置一个固定的硬编码值。
当我选择第一个单选按钮时,我无法从组合框中获取值。我尝试过使用ConverterParameter(我发现它不允许绑定),并且使用MultiBinding也没有帮助。
请建议。
谢谢!
答案 0 :(得分: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();
}
}
修改强>
如果您只需要对RadioButton的Checked事件做出反应,那么您可以使用以下内容:
<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并在Window / Page / Control中使用它... xmlns:i =&#34; http://schemas.microsoft.com/expression/2010/interactivity& #34;
然后,您可以在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选择。如果你也需要这个,那么你可以&#34;保存&#34;隐藏的TextBlock.Tag或StackPanel的标签或类似的绑定值。我相信你现在可以搞清楚了。