Skip to main content
All docs
V24.2

ReadOnlyDependencyPropertyBindingBehavior Class

Allows you to bind read-only dependency and attached properties to a ViewModel’s properties.

Namespace: DevExpress.Mvvm.UI

Assembly: DevExpress.Xpf.Core.v24.2.dll

NuGet Package: DevExpress.Wpf.Core

Declaration

public class ReadOnlyDependencyPropertyBindingBehavior :
    Behavior<DependencyObject>

Remarks

Specify the following properties to use ReadOnlyDependencyPropertyBindingBehavior:

Binding
Gets or sets a binding that should be applied to the specified property. This is a dependency property.
Property
Gets or sets the bound property’s name. This is a dependency property.
DependencyProperty
Gets or sets the bound property. This is a dependency property.

Customization properties:

Command
Gets or sets the command that the ReadOnlyDependencyPropertyBindingBehavior should execute when the bound property’s value is changed (specified in the Property or DependencyProperty). This is a dependency property.
IsEnabled
Gets or sets whether a bound ViewModel’s property should be updated. This is a dependency property.

Follow the steps below to bind a read-only dependency property to a ViewModel’s property:

  1. Attach the behavior to a target control and choose one of the following options:

    • Set the Property to a target property’s name:

          <TreeView>
              <dxmvvm:Interaction.Behaviors>
                      <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Property="SelectedItem" />
              </dxmvvm:Interaction.Behaviors>
          </TreeView>
      
    • Use the DependencyProperty to specify a target dependency/attached property:

       <TreeView>
          <dxmvvm:Interaction.Behaviors>
              <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior DependencyProperty="{x:Static TreeView.SelectedItemProperty}" />
          </dxmvvm:Interaction.Behaviors>
       </TreeView>
      
  2. Use the behavior’s Binding property to specify a binding to the target ViewModel’s property.

    <TreeView>
        <dxmvvm:Interaction.Behaviors>
            <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Binding="{Binding SelectedMenuItem, Mode=OneWayToSource}"
                                                              DependencyProperty="{x:Static TreeView.SelectedItemProperty}" />
        </dxmvvm:Interaction.Behaviors>
    </TreeView>
    

The following code sample binds the TreeView.SelectedItem read-only property to the ViewModel’s SelectedMenuItem property:

<UserControl x:Class="DXSample.Views.MainView"
<!-- ... -->
             xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
             <!-- ... -->
             xmlns:ViewModels="clr-namespace:DXSample.ViewModels"
             <!-- ... -->
    <UserControl.DataContext>
        <ViewModels:MainViewModel />
    </UserControl.DataContext>

    <DockPanel>
        <TreeView Name="view" ItemsSource="{Binding Menu}">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type ViewModels:MenuItemViewModel}" ItemsSource="{Binding Items}">
                    <TextBlock Text="{Binding Title}" />
                </HierarchicalDataTemplate>
            </TreeView.Resources>
            <dxmvvm:Interaction.Behaviors>
                <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Binding="{Binding SelectedMenuItem, Mode=OneWayToSource}"
                                                                  DependencyProperty="{x:Static TreeView.SelectedItemProperty}" />
            </dxmvvm:Interaction.Behaviors>
        </TreeView>
    </DockPanel>

</UserControl>
using System.Collections.ObjectModel;
using System.Windows;
using DevExpress.Mvvm;
using DevExpress.Mvvm.DataAnnotations;
// ...
    public class MainViewModel : ViewModelBase {
        public MenuItemViewModel SelectedMenuItem {
            get { return GetProperty(() => SelectedMenuItem); }
            set { SetProperty(() => SelectedMenuItem, value); }
        }

        [Command]
        public void Open() {
        // ...
        }
        // ...
    }

How to: Pass Validation Data from the GridControl to a ViewModel

To pass validation data from the GridControl to a view model, use the ReadOnlyDependencyPropertyBindingBehavior to bind the view’s HasErrors property to a view model property. Set the view’s ErrorsWatchMode property to Cells.

<dx:ThemedWindow x:Class="DXSample.MainWindow"
                 Title="{DXBinding '`GridControl has errors: ` + HasErrors'}">

    <dx:ThemedWindow.DataContext>
        <local:MainViewModel />
    </dx:ThemedWindow.DataContext>

    <DockPanel>
        <dxg:GridControl AutoGenerateColumns="AddNew"
                         ItemsSource="{Binding TaskList}">
            <dxg:GridControl.View>
                <dxg:TableView ErrorsWatchMode="Cells"
                               InvalidRowExceptionCommand="{Binding InvalidRowCommand}"
                               ValidateRowCommand="{Binding ValidateRowCommand}">
                    <dxmvvm:Interaction.Behaviors>
                        <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Property="HasErrors"
                                                                          Binding="{Binding HasErrors, UpdateSourceTrigger=PropertyChanged}" />
                    </dxmvvm:Interaction.Behaviors>
                </dxg:TableView>
            </dxg:GridControl.View>
        </dxg:GridControl>
    </DockPanel>

</dx:ThemedWindow>
public class MainViewModel : ViewModelBase {
    public bool HasErrors {
        get { return GetValue<bool>(); }
        set { SetValue(value); }
    }
    public ObservableCollection<Task> TaskList { get; }
    public MainViewModel() {
        TaskList = new ObservableCollection<Task> {
            new Task() {
                TaskName = "Complete Project A",
                StartDate = new DateTime(2009, 7, 17),
                EndDate = new DateTime(2009, 7, 10)
            },
            new Task() {
                TaskName = "Test Website",
                StartDate = new DateTime(2009, 7, 10),
                EndDate = new DateTime(2009, 7, 12)
            },
            new Task() {
                TaskName = string.Empty,
                StartDate = new DateTime(2009, 7, 4),
                EndDate = new DateTime(2009, 7, 6)
            }
        };
    }

    [Command]
    public void ValidateRow(RowValidationArgs args) {
        args.Result = GetValidationErrorInfo((Task)args.Item);
    }
    static ValidationErrorInfo GetValidationErrorInfo(Task task) {
        if (task.StartDate > task.EndDate)
            return new ValidationErrorInfo("Start Date must be less than End Date");
        if (string.IsNullOrEmpty(task.TaskName))
            return new ValidationErrorInfo("Enter a task name");
        return null;
    }

    [Command]
    public void InvalidRow(InvalidRowExceptionArgs args) {
        args.ExceptionMode = ExceptionMode.NoAction;
    }
}

Inheritance

Object
DispatcherObject
DependencyObject
Freezable
Animatable
DevExpress.Mvvm.UI.Interactivity.AttachableObjectBase
DevExpress.Mvvm.UI.Interactivity.Behavior
DevExpress.Mvvm.UI.Interactivity.Behavior<DependencyObject>
ReadOnlyDependencyPropertyBindingBehavior
See Also