Skip to main content
All docs
V25.1
  • DevExpress v25.1 Update — Your Feedback Matters

    Our What's New in v25.1 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

    Take the survey Not interested

    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.v25.1.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