2017-01-19 2 views
0

я создал фиктивное окно с{Binding ELEMENTNAME ...} неспособность

  • флажком
  • кнопкой
  • кнопка внутри пользовательского UserControl

Обе кнопки запуска из Синий, и когда флажок установлен, они оба должны стать оранжевыми. Тем не менее, внутри пользовательского элемента управления, по-видимому, игнорируется флажок. Почему это не удается, и как я могу обойти это?

UserControl Я хочу, чтобы вставить:

<UserControl x:Class="UserControl1" 
     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" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 


     <Grid> 
      <!--MyContent is a dependency property in UserControl1's code behind--> 
      <ContentControl Content="{Binding MyContent}">  
     </Grid> 
</UserControl> 

Главное окно:

<Window x:Class="WpfApplication11.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
     <Window.Resources> 
      <ResourceDictionary> 

       <Style TargetType="Button"> 
        <Setter Property="Background" Value="Cyan"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=myCheckbox, Path=isChecked}" Value="True"> 
          <Setter Property="Background" Value="Orange/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 

       <Button x:Key="Button1" Content="Button1"/> 
       <Button x:Key="Button2" Content="Button2"/> 

      </ResourceDictionary> 
     </Window.Resources> 

     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
       <RowDefinition Height="1*"/> 
      </Grid.RowDefinitions> 

      <CheckBox x:Name = "myCheckBox" Content="Turn Orange" Grid.Row="0"/> 

      <!--This updates when I check myCheckBox-->   
      <ContentControl Content = "{StaticResource Button1}" Grid.Row="2"/> 

      <!--This does NOT update when I check myCheckBox--> 
      <test:UserControl1 MyContent="{StaticResource Button2}" Grid.Row="2"/> 

     </Grid> 
</Window> 
+0

Невозможно это гарантировать; но у меня есть сильное чувство, что 'myCheckbox' выходит за рамки, когда вы находитесь внутри' UserControl1'. Я предполагаю, что у вас есть Исключение System.Data. Не так много вы можете сделать по этому поводу, но не полагайтесь на elementName так много – BradleyDotNET

ответ

1

Почему неудачу

Поскольку нет CheckBox с именем "myCheckBox" в UserControl. CheckBox в родительском окне находится в другой области имен, поэтому привязка к ElementName не будет работать здесь.

Как я могу обойти это?

Изучите и примените шаблон проектирования MVVM: https://msdn.microsoft.com/en-us/library/hh848246.aspx. Это рекомендуемый шаблон дизайна для использования при разработке приложений на основе XAML.

Создать вид модели класс, содержащий текущее состояние CheckBox:

public class ViewModel : INotifyPropertyChanged 
{ 
    private bool _isChecked; 
    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set { _isChecked = value; OnPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

И установить DataContext окна к экземпляру этого и связать его IsChecked собственности вместо того, чтобы связываться непосредственно с CheckBox:

<Window ...> 
    <Window.Resources> 
     <Style TargetType="Button"> 
      <Setter Property="Background" Value="Cyan"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
        <Setter Property="Background" Value="Orange"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
     <Button x:Key="Button1" Content="Button1"/> 
     <Button x:Key="Button2" Content="Button2"/> 
    </Window.Resources> 
    <Window.DataContext> 
     <test:ViewModel /> 
    </Window.DataContext> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="1*"/> 
      <RowDefinition Height="1*"/> 
      <RowDefinition Height="1*"/> 
     </Grid.RowDefinitions> 

     <CheckBox x:Name ="myCheckBox" Content="Turn Orange" Grid.Row="0" IsChecked="{Binding IsChecked}"/> 

     <ContentControl Content = "{StaticResource Button1}" Grid.Row="1"/> 

     <test:UserControl2 MyContent="{StaticResource Button2}" Grid.Row="2"/> 

    </Grid> 
</Window> 

UserControl должен наследовать DataContext родительского окна, так что не установить свойство DataContext явно UserControl1.xaml:

<UserControl x:Class="WpfApplication11.UserControl1" 
      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:local="clr-namespace:WpfApplication2" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <ContentControl Content="{Binding MyContent, RelativeSource={RelativeSource AncestorType=UserControl}}" /> 
    </Grid> 
</UserControl> 
+0

Пожалуйста, не забудьте проголосовать за полезные ответы :) http://stackoverflow.com/help/privileges/vote-up – mm8

0

Вы не можете ссылаться на myCheckBox от стиля, это две разные области применения. Кроме того, стиль нацелен на кнопку, но элемент управления - это окно. Вам нужно будет поместить все элементы управления в стиле в шаблоне управления.