2010-12-29 1 views
3

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

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

View Model Code:

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

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

<Button Content="Create New" 
     Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type AdornerDecorator}}, 
          Path=Child.DataContext.CreateNewFolder}" 
     Margin="10" Padding="5"></Button> 
+0

.. Большое спасибо. Оно работает. В то время как я пытался, я пробовал даже этот метод, но я пропустил Child.DataContext в Пути. Теперь, добавив это, я вижу, что это работает. Большое спасибо. –

+0

@Nicolas ... Это дает мне ошибку, когда я использую createNewFolder = new RelayCommand (OnCreateNewFolder); , поэтому я использовал его как: createNewFolder = new RelayCommand (param => this.OnCreateNewFolder()); –

0

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

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

Может быть, вы должны заменить его на:

createNewFolder = new RelayCommand(OnCreateNewFolder);