Можем ли мы иметь кнопки в шаблоне проверки и как мы можем связать его с методом ViewModel? - PullRequest
3 голосов
/ 29 декабря 2010

Требование:
Требуется отобразить сообщение об ошибке, когда пользователь вводит имя forlder, которое не существует, как показано ниже: alt text

Проблема: я могу отобразитьПользовательский интерфейс, но не может вызвать метод в модели представления, когда пользователь нажимает кнопку «CreateNew»

Код модели представления:

    public string this[string columnName]
    {
        get { return "The entered folder name doesn't exist."; }
    }

    RelayCommand createNewFolder;
    public RelayCommand CreateNewFolder
    {
        get
        {
            if (createNewFolder == null)
                createNewFolder = new RelayCommand(param => this.OnCreateNewFolder());
            return createNewFolder;

        }

    }
    public void OnCreateNewFolder()
    {
        MessageBox.Show("CreateNewFolder");
    }



RelayCommand.csможно загрузить по адресу: http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mag200902MVVM&DownloadId=4357



Код Xaml:

<Window.Resources>        
    <ControlTemplate x:Key="validationTemplate">
        <DockPanel LastChildFill="True">
            <Border Margin="5,5,0,0" DockPanel.Dock="Bottom" Background="Red">
            <StackPanel>
                <TextBlock Name="ErrorText"  Foreground="White" Background="Red" 
                                   FontSize="12" Padding="2" FontFamily="Trebuchet MS"                                                                                
                                   TextWrapping="Wrap"                                        
                                   Text="{Binding [0].ErrorContent}" ></TextBlock>
                <StackPanel Margin="0" Orientation="Horizontal">
                    <Button Content="Create New" Command="{Binding Path=CreateNewFolder}" Margin="10" Padding="5"></Button>
                    <Button Content="Cancel" Margin="10" Padding="5" ></Button>
                </StackPanel>
            </StackPanel>
            </Border>
            <AdornedElementPlaceholder Name="ErrorTextBox" />
        </DockPanel>
    </ControlTemplate>
    <Style x:Key="ValidationStyle" TargetType="{x:Type ComboBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="BorderBrush" Value="Red" />
                <Setter Property="BitmapEffect">
                    <Setter.Value>
                        <BitmapEffectGroup>
                            <OuterGlowBitmapEffect GlowColor="Red" GlowSize="3" Noise="0.6"></OuterGlowBitmapEffect>
                        </BitmapEffectGroup>
                    </Setter.Value>
                </Setter> 
                <Setter Property="DataContext"
                        Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=DataContext}">
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>


<Grid>
    <AdornerDecorator >
        <ComboBox IsEditable="True" FontSize="11" Margin="10" Width="250"      
              VerticalAlignment="Center" 
              Text="{Binding Path=StrText, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" 
              Validation.ErrorTemplate="{StaticResource validationTemplate}"
              Style="{StaticResource ValidationStyle}"></ComboBox>
    </AdornerDecorator>
</Grid>


Обратите внимание, что я установил свойство DataContext в стиле:

 <Setter Property="DataContext" Value="{Binding RelativeSource={x:Static 
          RelativeSource.Self},Path=DataContext}">
 </Setter>    



Пожалуйста, дайте мне знать, как привязать метод к кнопке в шаблоне проверки.

Ответы [ 2 ]

2 голосов
/ 29 декабря 2010

Вы можете ссылаться на DataContext для дочернего элемента AdornerDecorators в привязке.Я думаю, что-то подобное будет работать

<Button Content="Create New"
        Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type AdornerDecorator}},
                          Path=Child.DataContext.CreateNewFolder}"
        Margin="10" Padding="5"></Button>
0 голосов
/ 29 декабря 2010

Эта строка выглядит подозрительно:

createNewFolder = new RelayCommand(param => this.OnCreateNewFolder());

Возможно, вам следует заменить его на:

createNewFolder = new RelayCommand(OnCreateNewFolder);
...