获取转换器中另一个控件的值

本文关键字:控件 另一个 转换器 获取 | 更新日期: 2023-09-27 18:35:24

>我有 2 个单选按钮,通过 XPath 绑定到 XML。如果我选择第一个单选按钮,则需要获取组合框的选定值,并将其设置为 XML 元素。但是,如果我选择第二个单选按钮,则只需设置固定的硬编码值。

当我选择第一个单选按钮时,我无法从组合框中获取值。我尝试使用ConverterParameter(我发现它不允许绑定),使用MultiBinding也没有帮助。

请指教。

谢谢!

获取转换器中另一个控件的值

您在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();
    }
}

编辑:

如果你只需要对单选按钮的 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="http://schemas.microsoft.com/expression/2010/interactivity"

然后,您可以在视图模型中处理此问题:

    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的标签或类似的东西。我相信你现在可以弄清楚了。