将控件值与具有值列表的属性绑定.这是可能的
本文关键字:绑定 属性 列表 控件 | 更新日期: 2023-09-27 18:09:08
我有一些窗口,我有一些控件(时间段选择器):
更新<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" />
在窗口类中我做了property:
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 }
};
现在我想做一些事情来更新滑块值当我改变值在分组框。有可能做到吗?
我已经这样做了:
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;
}
但对我来说,这不是一个很好的解决方案。也许你知道更简单的方法?
我删除了你的设计属性,使解决方案看起来更干净。
在代码中公开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
的属性绑定到ListBox
(实际上是TimePeriodType
,因为之前的绑定)的SelectedItem
的属性:
<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" />
我找到解决方案了。应该有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}}"