Skip to main content
A newer version of this page is available. .
All docs
V21.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.v21.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() {
        // ...
        }
        // ...
    }

View Example

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.

View Example

<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;
    }
}

The following code snippet (auto-collected from DevExpress Examples) contains a reference to the ReadOnlyDependencyPropertyBindingBehavior class.

Note

The algorithm used to collect these code examples remains a work in progress. Accordingly, the links and snippets below may produce inaccurate results. If you encounter an issue with code examples below, please use the feedback form on this page to report the issue.

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