将控件值与具有值列表的属性绑定.这是可能的

本文关键字:绑定 属性 列表 控件 | 更新日期: 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}}"