我正在構建一個使用WPF和MVVM的應用程序。我碰到過一個包含一個usercontrol(代表一個Timer)的視圖。這個用戶控件在其代碼後面有一個屬性,它在獲取和設置數據之前執行一些計算。綁定到用戶控件的屬性,包含邏輯,在視圖模型中的屬性
TimerControl.xaml.cs:
public DateTime? DateTimeValue
{
get
{
string hours = this.txtHours.Text;
string minutes = this.txtMinutes.Text;
string amPm = this.txtAmPm.Text;
if (!string.IsNullOrWhiteSpace(hours) && !string.IsNullOrWhiteSpace(minutes) && !string.IsNullOrWhiteSpace(amPm))
{
string value = string.Format("{0}:{1} {2}", this.txtHours.Text, this.txtMinutes.Text, this.txtAmPm.Text);
DateTime time = DateTime.Parse(value);
return time;
}
else
{
return null;
}
}
set
{
DateTime? time = value;
if (time.HasValue)
{
string timeString = time.Value.ToShortTimeString();
//9:54 AM
string[] values = timeString.Split(':', ' ');
if (values.Length == 3)
{
this.txtHours.Text = values[0];
this.txtMinutes.Text = values[1];
this.txtAmPm.Text = values[2];
}
}
}
}
現在,我想這個屬性與存在於視圖中的視圖模型的屬性。以下是在虛擬機屬性:
public DateTime? StartTime
{
get
{
return _StartTime;
}
set
{
_StartTime = value;
RaisePropertyChanged("StartTime");
}
}
這是怎麼了表演鑑於XAML綁定。
MyView.xaml:
<my:TimeControl Background="White" Grid.Column="1" Grid.Row="2" Margin="3" x:Name="StartTimeControl" DateTimeValue="{Binding StartTime}" Width="150" Height="26" HorizontalAlignment="Left">
但它給我一個錯誤: A '綁定' 無法在類型 'TimeControl' 的 'DateTimeValue' 屬性設置。 '綁定'只能在DependencyObject的DependencyProperty上設置。
我一直在掙扎了幾個小時試圖找出一種方法,使這種結合工作。我甚至試圖在TimeControl的代碼中爲DateTimeValue屬性創建一個依賴屬性,該屬性解決了上述異常,但綁定仍然無效。每當我在後面的VM代碼中訪問StartTime屬性時,它都顯示爲空。雖然它應該通過獲取DateTimeValue屬性來顯示有效值。
請給我建議的方式來完成這項工作。謝謝。
謝謝亞歷克斯!綁定仍然不起作用。這就是我定義依賴屬性DateTimeValue:公共只讀靜態的DependencyProperty DateTimeValueProperty = DependencyProperty.Register( 「DateTimeValue」 的typeof(DateTime的)的typeof(TimeControl),新FrameworkPropertyMetadata(){ PropertyChangedCallback = OnDemoChanged, BindsTwoWayByDefault =真 });此外,爲了工作,我需要將GetValue和SetValue保存在DateTimeValue的get和set中。但在我的場景中,我有一些邏輯。 – 2011-05-06 13:21:31
我已經更新了我的答案。你應該把你的邏輯放在其他地方,而不是DP。例如DP有CoerceValueCallback,試試吧。 – 2011-05-06 13:33:20
謝謝亞歷克斯!你的解決方案確實有幫我已經從DP的getter和setter中移除了邏輯,並將其保存在一個函數中,該函數每次在計時器控件的任何文本框中更改數據時都會調用該函數。另外我在xaml中進行綁定的方式是錯誤的。但按照您指定的方式完成後,事情就開始奏效了。再次感謝 ! – 2011-05-06 16:16:30