Привязать управляющее значение со свойством, которое имеет список значений.Это возможно? - PullRequest
1 голос
/ 20 сентября 2011

У меня есть окна, где у меня есть некоторые элементы управления (выбор периода времени):

ОБНОВЛЕНО

<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. Есть ли возможность сделать это?

Уже я делаю это так:

    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 ]

1 голос
/ 20 сентября 2011

Я удалил ваши атрибуты дизайна, чтобы решение выглядело немного чище.

Сохраните ваш список TimePeriodType s в вашем коде:

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" />
0 голосов
/ 20 сентября 2011

Хорошо, я нашел решение. Должно быть свойство с методом 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}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...