我有窗口,我有一些控件(时间段选择器):
已更新
<ComboBox DisplayMemberPath="{Binding Path=Name}" ItemsSource="{Binding Periods}" Name="timeType" />
<Slider Value="20" Minimum="{Binding SelectedItem.Min, ElementName=timeType}" Maximum="{Binding SelectedItem.Max, ElementName=timeType}" Name="timeSlider" />
<Label Content="{Binding ElementName=timeSlider, Path=Value}" Name="timeValue" />
<Label Content="{Binding ElementName=timeSlider, Path=Minimum}" Name="timeValueMin" />
<Label Content="{Binding ElementName=timeSlider, Path=Maximum}" Name="timeValueMax" />
在窗口类中我做了属性:
public class TimePeriodType {
public string Name { set; get; }
public int Min { set; get; }
public int Max { set; get; }
}
public List<TimePeriodType> Periods = new List<TimePeriodType>() {
new TimePeriodType() { Name="Hours", Max=6, Min=1 },
new TimePeriodType(){ Name="Minutes", Max=59, Min=20 }
};
现在我想在Groupbox中更改值时想要更新Slider值。有没有可能做到这一点?
我已经这样做了:
private void timeType_SelectionChanged( object sender, SelectionChangedEventArgs e ) {
var period = Periods.Single(p => p.Name == timeType.SelectedValue.ToString());
timeSlider.Minimum = period.Min;
timeSlider.Maximum = period.Max;
}
但对我来说这不是一个好方法。 也许你知道更简单的方法吗?
答案 0 :(得分:1)
我删除了您的设计属性,使解决方案看起来更清晰。
在代码中公开TimePeriodType
列表:
public List<TimePeriodType> Periods = new List<TimePeriodType>() {
new TimePeriodType() { Name="Hours", Max=6, Min=1 },
new TimePeriodType() { Name="Minutes", Max=59, Min=20 }
};
确保您的DataContext
已正确设置,以允许您绑定到您正在使用的支持类的成员。
然后,将ListBox
(或其他Selector
控件)绑定到该列表:
<ListBox ItemsSource="{Binding Periods}"
Name="timeType" />
现在,您可以直接将Slider
的属性绑定到SelectedItem
ListBox
的属性(实际上是TimePeriodType
,因为之前的属性<Slider Maximum="{Binding SelectedItem.Max, ElementName=timeType}"
Minimum="{Binding SelectedItem.Min, ElementName=timeType}"
Name="timeSlider" />
结合):
Slider
最后,您可以将标签绑定到分配给<Label Content="{Binding Value, ElementName=timeSlider}"
Name="timeValue" />
<Label Content="{Binding Minimum, ElementName=timeSlider}"
Name="timeValueMin" />
<Label Content="{Binding Maximum, ElementName=timeSlider}"
Name="timeValueMax" />
的值:
{{1}}
答案 1 :(得分:0)
好的,我找到了解决方案。 应该有get方法的属性:
public class TimePeriodType {
public string Name { set; get; }
public int Min { set; get; }
public int Max { set; get; }
}
List<TimePeriodType> _periods = new List<TimePeriodType>() {
new TimePeriodType() { Name="Hours", Max=6, Min=1 },
new TimePeriodType() { Name="Minutes", Max=59, Min=20 }
};
public List<TimePeriodType> Periods {
get { return _periods; }
set { _periods = value; }
}
另外还应该有以下约束:
ItemsSource="{Binding Periods, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"