在 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
绑定到 XValue
或 YValue
我认为您不能动态更改绑定(至少在 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
会更新为 XValue
或 YValue
。 Slider
值更改时,XValue
或 YValue
会根据 ComboBox
选择进行更新。
您可以将 Style
与绑定到 ComboBox
的 SelectedItem
的 DataTrigger
结合使用:
<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>
在我看来,我有一个 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
绑定到 XValue
或 YValue
我认为您不能动态更改绑定(至少在 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
会更新为 XValue
或 YValue
。 Slider
值更改时,XValue
或 YValue
会根据 ComboBox
选择进行更新。
您可以将 Style
与绑定到 ComboBox
的 SelectedItem
的 DataTrigger
结合使用:
<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>