私は何か簡単なことをしようとしています-DependencyPropertyを作成してからそれにバインドします。ただし、アプリを起動してもゲッターが起動しないようです。(解決策は私が頭を叩いて「Doh!」に行くようになると思いますが、それでも。:))
何か案は?
コードビハインドコード:
public static readonly DependencyProperty PriorityProperty =
DependencyProperty.Register("Priority",
typeof (Priority), typeof (PriorityControl), null);
public Priority Priority
{
get { return (Priority)GetValue(PriorityProperty); }
set { SetValue(PriorityProperty, value); }
}
XAMLの制御:
<ListBox Background="Transparent"
BorderThickness="0"
ItemsSource="{Binding Path=Priorities}"
Name="PriorityList"
SelectedItem="{Binding Path=Priority, Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Height="16" Width="16">
<Border BorderBrush="Black"
BorderThickness="2"
CornerRadius="3"
Visibility="{Binding RelativeSource=
{RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected, Converter={StaticResource boolToVisibilityConverter}}" />
<Border CornerRadius="3" Height="12" Width="12">
<Border.Background>
<SolidColorBrush Color="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=Content, Converter={StaticResource priorityToColorConverter}}" />
</Border.Background>
</Border>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
バインディングステートメント:
<UI:PriorityControl Grid.Column="8"
Priority="{Binding Path=Priority}"
VerticalAlignment="Center"/>
その他の注意事項:
- バインディングはUserControlにあります
- UserControlにはPriorityControlが含まれています
- PriorityControlにはDependencyPropertyが含まれています
- UserControlが適切なデータを取得しているデータを確認しました。他のすべてのバインディングが機能します。
- マウスを使用してPriorityControlの選択を変更すると、すべてが適切に起動します。動作していないのは、値の初期設定だけです。
- 優先度は列挙型です。
編集:私はさらに2つのことを試しました。最初に、値へのバインディングを双方向にしましたが、それは機能しませんでした。次に、プロパティ変更コールバックを依存関係プロパティに追加し、次のようにOnPropertyChangedを呼び出すようにしました。
public static readonly DependencyProperty PriorityProperty =
DependencyProperty.Register("Priority", typeof (Priority), typeof (PriorityControl), new PropertyMetadata(HandleValueChanged));
private static void HandleValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
var npc = dependencyObject as PriorityControl;
npc.OnPropertyChanged("Priority");
}
それもうまくいきませんでした。コントロールのApplyTemplateをオーバーライドしてプロパティ変更通知を強制しようとしましたが、初期ロード時に値が設定されません。値を変更して、すべてが正常に起動することを確認できますが、何も発生しないのは初めてです。