2014-10-02 122 views
0

我有一个控件,需要使用复选框启用禁用部分,但我需要将其绑定到一个类所以我做了以下。所以我的问题是我如何设置绑定到说例如IncidentBuilderProperty.IsEnabled我应该使用参数后面的代码。如何解决绑定问题

<DockPanel DockPanel.Dock="Top" > 
    <Label Content="Display" /> 
    <CheckBox Name="chkDisplayAdvanced" IsThreeState="False" VerticalAlignment="Center" 
      IsChecked="{Binding isEnabled, Mode=TwoWay}" /> 
</DockPanel> 

但在我的模型中我有属性isEnabled声明在下面的方式。

所以我的问题是我将如何访问属性IncidentBuilderProperty.isEnabled bare记住他们是每个属性与此复选框,但它引用一个自定义控件的屏幕。

public class AssignedToMeViewData : WizardData, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public ManagementPack ManagmentPack { get; set; } 
    public List<BuilderProperties> BuilderProperty { get; set; } 
    public BuilderProperties GeneralPage { get; set; } 
    public Exception LastKnownException { get; set; } 
    [DefaultValue(true)] 
    public bool IsNew { get; set; } 

    public BuilderProperties IncidentBuilderProperty { get; set; } 
    public BuilderProperties ProblemBuilderProperty { get; set; } 
    public BuilderProperties ServiceRequestBuilderProperty { get; set; } 
    public BuilderProperties ChangeRequestBuilderProperty { get; set; } 
    public BuilderProperties RleaseRequestBuilderProperty { get; set; } 
    public BuilderProperties ReviewActivityBuilderProperty { get; set; } 
    public BuilderProperties ManualActivityBuilderProperty { get; set; } 


    public class BuilderProperties 
    { 
     private bool isEnabled = true; 
     public bool IsEnabled { 
      get { 
       return isEnabled; 
      } 
      set { 
       if (isEnabled == value) 
        return; 

       isEnabled = value; 
      } 
     } 
    } 
} 
+0

取而代之的回报,为什么不能你写的,如果(的IsEnabled =价值!) 的IsEnabled =值; – 2014-10-02 15:45:43

+0

@kishoreVM问题不在于我如何写入属性,而是如何在绑定中访问它,请保持主题谢谢。 – rogue39nin 2014-10-02 15:47:27

+0

试试这个:IsChecked =“{绑定路径= IncidentBuilderProperty.IsEnabled,Mode = TwoWay} – vidriduch 2014-10-02 15:49:41

回答

0

拥有该控件的DataContextAssignedToMeViewData,你可以设置在XAML绑定到你的所有BuilderProperties这样的:

<DockPanel DockPanel.Dock="Top" > 
    <Label Content="Display" /> 
    <CheckBox x:Name="chkIncident" IsChecked="{Binding IncidentBuilderProperty.IsEnabled, Mode=TwoWay}" VerticalAlignment="Center" /> 
    <CheckBox x:Name="chkProblem" IsChecked="{Binding ProblemBuilderProperty.IsEnabled, Mode=TwoWay}" VerticalAlignment="Center" /> 
    <CheckBox x:Name="chkService" IsChecked="{Binding ServiceRequestBuilderProperty.IsEnabled, Mode=TwoWay}" VerticalAlignment="Center" /> 
    <CheckBox x:Name="chkChanges" IsChecked="{Binding ChangeRequestBuilderProperty.IsEnabled, Mode=TwoWay}" VerticalAlignment="Center" /> 
    ... 
</DockPanel> 

但是请注意,Mode=TwoWayCheckBox.Checked默认的,所以你不不需要指定。从代码 - 创建绑定时

chkIncident.SetBinding(CheckBox.IsCheckedProperty, 
         new Binding("IncidentBuilderProperty.IsEnabled")); 
chkProblem.SetBinding(CheckBox.IsCheckedProperty, 
         new Binding("ProblemBuilderProperty.IsEnabled")); 
chkService.SetBinding(CheckBox.IsCheckedProperty, 
         new Binding("ServiceRequestBuilderProperty.IsEnabled")); 
... 

见纪的评论对您的问题进行更高级的选项:

如果你必须从后台代码改为这样做,你可以设置绑定像这样背后。

+0

我不想让屏幕上出现四个复选框,使它们无法使用 – rogue39nin 2014-10-03 10:11:12

+0

对不起,我不明白你的意思。你想达到的究竟是什么? – Sphinxxx 2014-10-03 10:24:09

0

请尝试下面的代码片段

FrameworkElement targetObject = chkDisplayAdvanced; 
DependencyProperty targetProperty = CheckBox.IsCheckedProperty; 
object sourceObject = IncidentBuilderProperty;//object of the actual Incidentbuilderclasss here 
string sourceProperty = "IsEnabled"; 
var binding = new Binding(sourceProperty) { 
    Source = sourceObject, Mode = BindingMode.TwoWay 
    }; 
targetObject.SetBinding(targetProperty, binding);