2016-03-03 62 views
0

我有一個支付期限列表,我已經綁定到一個ComboBox,我想通過點擊按鈕(即一組Previous按鈕)。根據選定的支付期限,我想填充數據庫中的時間記錄列表。使用按鈕更改綁定的WPF組合框SelectedItem

C#代碼

public TimeSheetViewModel() 
{ 
    BuildPayPeriods(); 
    GetEmployeeList(); 
    GetTimes(SelectedEmployee, SelectedPayPeriod); 
    NextPayPeriod = new RelayCommand(NextPayPeriodCommand); 
    PrevPayPeriod = new RelayCommand(PrevPayPeriodCommand); 
    SelectedPayPeriodChanged = new RelayCommand(SelectPayPeriodCommand); 
} 

public ObservableCollection<PayPeriod> PayPeriods { get; set; } 

private PayPeriod _SelectedPayPeriod; 

public PayPeriod SelectedPayPeriod 
{ 
    get 
    { 
     return _SelectedPayPeriod; 
    } 
    set 
    { 
     _SelectedPayPeriod = value; 
     GetTimes(SelectedEmployee, value); 
     OnPropertyChanged("SelectedPayPeriod") 
    } 
} 

public RelayCommand NextPayPeriod { get; set; } 

void NextPayPeriodCommand(object parameter) 
{ 
    int index = PayPeriods.IndexOf((PayPeriod)parameter); 

    \\EDIT 
    if (index != 0 && CheckForEdits()) 
    { 
     SelectedPayPeriod = PayPeriods[index - 1]; 
    } 
} 

public RelayCommand PrevPayPeriod { get; set; } 

void PrevPayPeriodCommand(Object parameter) 
{ 
    int index = PayPeriods.IndexOf((PayPeriod)parameter); 

    \\EDIT 
    if (index != (PayPeriods.Count - 1) && CheckForEdits()) 
    { 
     SelectedPayPeriod = PayPeriods[index + 1]; 
    } 
} 

public RelayCommand SelectedPayPeriodChanged { get; set; } 

void SelectPayPeriodCommand(Object parameter) 
{ 
    \\EDIT 
    if (parameter != null && CheckForEdits()) 
    { 
     int index = PayPeriods.IndexOf((PayPeriod)parameter); 

     SelectedPayPeriod = PayPeriods[index]; 
    } 
} 

XAML代碼

<Button x:Name="btnPrevWeek" Command="{Binding PrevPayPeriod}" CommandParameter="{Binding Path=SelectedItem, ElementName=comboPayPeriod}"/> 
<ComboBox x:Name="comboPayPeriod" ItemsSource="{Binding PayPeriods}" DisplayMemberPath="Display" SelectedItem="{Binding SelectedPayPeriod, Mode=OneWay}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <i:InvokeCommandAction Command="{Binding SelectedPayPeriodChanged}" CommandParameter="{Binding Path=SelectedItem, ElementName=comboPayPeriod}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ComboBox> 
<Button x:Name="btnNextWeek" Command="{Binding NextPayPeriod}" CommandParameter="{Binding Path=SelectedItem, ElementName=comboPayPeriod}"> 

我試圖離開了代碼,似乎不相干的格式化和佈局的東西的東西。

SelectedPayPeriodChanged的作品,所以如果我手動更改組合框的選定項目點擊它一切工作正常。另外兩個,PrevPayPeriod和NextPayPeriod,像他們應該觸發,但選定的項目不會改變。

所有的項目都顯示正常,當我點擊不同的支付期時,它會加載一個新的時間表就好了,但單擊prev和next按鈕不會改變我的SelectedPayPeriod。

我對此相當新,所以任何幫助/批評表示讚賞。

感謝

+1

更新所選項目的結合模式爲雙向 –

+0

如果我更新了我的問題。我正在使用名爲CheckForEdits()的函數來查看是否有任何未保存的更改,然後才能轉到下一個付款期限。如果我想在實際更改所選項目之前驗證,我仍然可以使用兩種方法嗎?謝謝 –

回答

0

正如評論說明更新您的結合是TwoWay,我還沒有看到你有沒有觸發任何附加價值。結合將採取更新的護理:

<Button x:Name="btnPrevWeek" Command="{Binding PrevPayPeriod}" CommandParameter="{Binding Path=SelectedItem, ElementName=comboPayPeriod}"/> 
<ComboBox x:Name="comboPayPeriod" ItemsSource="{Binding PayPeriods}" DisplayMemberPath="Display" SelectedItem="{Binding SelectedPayPeriod, Mode=TwoWay}" /> 
<Button x:Name="btnNextWeek" Command="{Binding NextPayPeriod}" CommandParameter="{Binding Path=SelectedItem, ElementName=comboPayPeriod}"> 

此外,我認爲你在前面和後面的處理邏輯是相反的,它應該是這樣的:

void PrevPayPeriodCommand(object parameter) 
{ 
    int index = PayPeriods.IndexOf((PayPeriod)parameter); 

    if (index != 0) // set previous if we're not pointing to the first element 
    { 
     SelectedPayPeriod = PayPeriods[index - 1]; 
    } 
} 

void NextPayPeriodCommand(object parameter) 
{ 
    int index = PayPeriods.IndexOf((PayPeriod)parameter); 

    if (index != PayPeriods.Count - 1) // set next if we're not pointing to last element 
    { 
     SelectedPayPeriod = PayPeriods[index + 1]; 
    } 
} 
+0

我已經稍微更新了我的問題。我之所以使用觸發器,是因爲我使用了一種名爲CheckForEdits()的函數來決定是否要更改付款期限。 CheckForEdits()返回一個布爾值(如果用戶保存了編輯或取消了它們,則返回true;如果他們想繼續編輯它們,則返回false)所以在錯誤的情況下,我不要更改索引。有沒有更好的方法來做這個驗證?另外,關於反向邏輯,你是正確的。哎呀!謝謝@ szabolcs-dézsi –