Прикрепленная DependecyProperty не обязательна во всех направлениях - PullRequest
0 голосов
/ 15 сентября 2010

В настоящее время я работаю над проблемой пользовательского элемента управления UserControl. Я хочу предоставить определенные свойства дочерних элементов управления в качестве свойств родительского элемента, а также хочу, чтобы привязка данных была возможной.Чтобы все это произошло, я создал Attached DependencyProperties на родительском объекте:

    //TimeframeSelector.xaml.cs
    public static readonly DependencyProperty EnableEndFilterProperty =
        DependencyProperty.RegisterAttached(
        "EnableEndFilter", 
        typeof(bool), 
        typeof(TimeframeSelector), 
        new FrameworkPropertyMetadata(false, 
            FrameworkPropertyMetadataOptions.Inherits |
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public static bool GetEnableEndFilter(DependencyObject obj)
    {
        return (bool)obj.GetValue(EnableEndFilterProperty);
    }

    public static void SetEnableEndFilter(DependencyObject obj, bool value)
    {
        obj.SetValue(EnableEndFilterProperty, value);
    }

    public bool EnableEndFilter
    {
        get { return (bool)GetValue(EnableEndFilterProperty); }
        set { SetValue(EnableEndFilterProperty, value); }
    } 

Эти присоединенные DP используются в xaml этого элемента управления:

//TimeframeSelector.xaml
<UserControl x:Class="EveTrader.Wpf.Controls.TimeframeSelector"
             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" 
             xmlns:ctrl="clr-namespace:EveTrader.Wpf.Controls"
             mc:Ignorable="d">

            <CheckBox IsChecked="{Binding 
             Path=(ctrl:TimeframeSelector.EnableEndFilter), 
             RelativeSource={RelativeSource Self}, Mode=TwoWay}"/>
</UserControl>

Теперь используется элемент управленияв другом элементе управления:

<ctrl:TimeframeSelector EnableEndFilter="{Binding ApplyEndFilter}" [...]/>

ViewModel для этого представления предоставляет значение из пользовательских настроек, которое корректно отображается в элементе управления, но любые изменения, внесенные в элемент управления, не возвращаются в ViewModel.

Итак, вопрос в том, как заставить работать контроль в обоих направлениях?Что-то уже должно работать, иначе элемент управления будет пустым (как это было до того, как я добавил флаг Inherits в DP).

Ответы [ 2 ]

1 голос
/ 15 сентября 2010

Унаследованные значения не совпадают с Bindings.Когда вы устанавливаете значение для свойства, которое было унаследовано от родителя (как делает привязка TwoWay при записи в источник), оно переопределяет значение, которое было унаследовано.Наследование является 10-м из 11 возможных источников значений .

. В этом случае использование присоединенного свойства с наследованием ничего не дает, поэтому вы можете немного упростить свой XAML, просто используявместо стандартного DP.

public static readonly DependencyProperty EnableEndFilterProperty =
    DependencyProperty.Register(
    "EnableEndFilter", 
    typeof(bool), 
    typeof(TimeframeSelector), 
    new FrameworkPropertyMetadata(false, 
        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

Вы можете использовать привязку ElementName или RelativeSource, чтобы использовать родительский UserControl непосредственно в качестве источника привязки, который позволит привязке работать в обоих направлениях так, как вы хотите.

<CheckBox IsChecked="{Binding Path=EnableEndFilter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ctrl:TimeFrameSelector}}}"/>

IsChecked - это TwoWayByDefault, так что вы можете также опустить это в Binding.

0 голосов
/ 15 сентября 2010

Попробуйте изменить XAML вашего UserControl на:

<UserControl x:Name="uc" ...>
    <CheckBox IsChecked="{Binding ElementName=uc, Path=(ctrl:TimeFrameSelector.EnableEndFilter), Mode=TwoWay}"/>
</UserControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...