使用具有值列表的属性绑定控件值。有可能的?

时间:2011-09-19 20:40:05

标签: c# .net wpf xaml data-binding

我有窗口,我有一些控件(时间段选择器):

已更新

<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;
    }

但对我来说这不是一个好方法。 也许你知道更简单的方法吗?

2 个答案:

答案 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}}"