について学んでいDependency Properties
ます。
内に を作成しDependency Property
、UserControl
内にMainWindow
コントロールのインスタンスを作成して値を設定します。これは期待どおりに機能します。
私の問題は、使用しようとするときBinding
です。
したがって、私の MainWindow XAML は次のようになります (StartTime 型は文字列です)
<Window x:Class="TimeLineCanvas.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:timeline="clr-namespace:TimeLineCanvas.UserControls"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<TextBlock Text="{Binding StartTime}" Height="100" /><!--Works binding to local property-->
<timeline:TimeLine StartTime="28/01/2015" Height="100" /><!--Works when hard coded value-->
<timeline:TimeLine StartTime="{Binding StartTime, UpdateSourceTrigger=PropertyChanged}" Height="100" /><!-- Does not display anything -->
<timeline:TimeLine x:Name="TimeLineInXaml" Height="100" /><!-- Works (value set in code behind) -->
</StackPanel>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Windows;
using System.ComponentModel;
namespace TimeLineCanvas
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
#region Constructors
public MainWindow()
{
InitializeComponent();
SetStartTime(DateTime.Now);
TimeLineInXaml.StartTime = _startTime;
this.DataContext = this;
}
#endregion
#region Properties
private string _startTime;
public string StartTime
{
get
{
return _startTime;
}
set
{
_startTime = value;
OnPropertyChanged("StartTime");
}
}
#endregion
#region Methods
internal void SetStartTime(DateTime dt)
{
this.StartTime = dt.ToShortDateString();
}
#endregion
#region INotifyPropertyChanged Implementation
public void OnPropertyChanged(string PropertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion INotify
}
}
私のユーザーコントロール
<UserControl x:Class="TimeLineCanvas.UserControls.TimeLine"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Canvas>
<TextBlock Text="{Binding StartTime, UpdateSourceTrigger=PropertyChanged}" />
</Canvas>
</Grid>
</UserControl>
および私の UserControl の背後にあるコード
using System;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
namespace TimeLineCanvas.UserControls
{
/// <summary>
/// Interaction logic for TimeLine.xaml
/// </summary>
public partial class TimeLine : UserControl, INotifyPropertyChanged
{
#region Constructor
public TimeLine()
{
InitializeComponent();
this.DataContext = this;
}
#endregion
#region Dependancy Properties
public static readonly DependencyProperty StartTimeProperty = DependencyProperty.Register(
"StartTime",
typeof(string),
typeof(TimeLine));
#endregion
#region Properties
public string StartTime
{
get { return (string)GetValue(TimeLine.StartTimeProperty); }
set
{
DateTime result;
if (!DateTime.TryParse(value, out result))
System.Diagnostics.Debug.Assert(false, "Expected a value which can be converted to a DateTime");
SetValue(TimeLine.StartTimeProperty, value);
}
}
#endregion
#region INotifyPropertyChanged Implementation
public void OnPropertyChanged(string PropertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion INotify
}
}
だから、問題は明らかです。それはバインディングですが、これを解決する方法がわかりません! DataContext="{Binding RelativeSource={RelativeSource Self}}
他の提案 ( UserControl への追加、MainWindow と UserContorl の両方への INotifyPropertyChanged の追加など) に基づく私の Voodoo プログラミング (すべてをランダムな順序で試す) でさえ、結果には影響しません。
私は何を間違っていますか、それとも意図していないことをしようとしていますか?