在 WPF 中,我想根据组合框选择动态设置项目源

In WPF, I want to dynamically set the itemsource based on combo box selection

在我看来,我有一个 Slider 和一个 Combobox。我的 ViewModel 中有 2 个属性。根据组合框的选择,我想将 属性 中的任何一个绑定到滑块的 value

 private int _xValue;

    public int XValue
    {
        get { return _xValue; }
        set
        {
            _xValue = value;
            NotifyPropertyChanged();
        }
    }

    private int _yValue;

    public int YValue
    {
        get { return _yValue; }
        set
        {
            _yValue = value;
            NotifyPropertyChanged();
        }
    }

 <StackPanel>
     <ComboBox SelectedIndex="0" Margin="2" Width="100">
        <ComboBoxItem Tag="X">X</ComboBoxItem>
        <ComboBoxItem Tag="Y">Y</ComboBoxItem>
    </ComboBox>

    <Slider Value="{Binding XValue}"></Slider>
</StackPanel>

我想根据 ComboBox 的选择将 Slider value 绑定到 XValueYValue

我认为您不能动态更改绑定(至少在 XAML 中)。但是,您可以执行以下操作:

<StackPanel>
    <ComboBox SelectedIndex="{Binding SelectedIndex}" Margin="2" Width="100">
        <ComboBoxItem Tag="X">X</ComboBoxItem>
        <ComboBoxItem Tag="Y">Y</ComboBoxItem>
    </ComboBox>

    <Slider Value="{Binding SliderValue}"></Slider>
</StackPanel>

Slider 现在绑定到另一个 属性 (SliderValue)。以下是您的视图模型中添加的属性:

private int _selectedIndex;
public int SelectedIndex
{
    get { return _selectedIndex; }
    set
    {
        _selectedIndex = value;
        NotifyPropertyChanged();

        if (SelectedIndex == 0)
            SliderValue = XValue;
        else if (SelectedIndex == 1)
            SliderValue = YValue;
    }
}

private int _sliderValue;
public int SliderValue
{
    get { return _sliderValue; }
    set
    {
        _sliderValue = value;
        NotifyPropertyChanged();

        if (SelectedIndex == 0)
            XValue = SliderValue;
        else if (SelectedIndex == 1)
            YValue = SliderValue;
    }
}

想法是,当通过 ComboBox 更改 SelectedItem 时,Slider 会更新为 XValueYValueSlider 值更改时,XValueYValue 会根据 ComboBox 选择进行更新。

您可以将 Style 与绑定到 ComboBoxSelectedItemDataTrigger 结合使用:

<ComboBox x:Name="cmb" SelectedIndex="0" Margin="2" Width="100">
    <ComboBoxItem Tag="X">X</ComboBoxItem>
    <ComboBoxItem Tag="Y">Y</ComboBoxItem>
</ComboBox>

<Slider>
    <Slider.Style>
        <Style TargetType="Slider">
            <Setter Property="Value" Value="{Binding XValue}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding SelectedItem.Tag, ElementName=cmb}" Value="Y">
                    <Setter Property="Value" Value="{Binding YValue}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Slider.Style>
</Slider>