2014-11-03 3 views
0

Мне нужно выполнить привязку с помощью ICommand, но похоже, что определенный класс я объявляю, что моя ICommand даже не запускается. Я определил следующую кнопку в моем AccView.xaml UserControlПереплет от XAML к определенному классу

<Button x:Name="buttonInit" Content="init" Height="32" Cursor="Hand" Command="{Binding initCommand}" HorizontalAlignment="Left" Margin="24,43,0,0" VerticalAlignment="Top" Width="156" Style="{DynamicResource RoundCornerButton}" /> 

Я тогда с помощью конкретного SetAccValues.cs класса:

public class GetAccValues : AccView 
{ 

    public ICommand initCommand 
    { 
     get { return new DelegateCommand<object>(initBluetooth, canInit); } 
    } 

    private async void initBluetooth(object context) 
    { 
     int serviceNumb = 1; 
     await InitializeAsync(PerformAccOperations.Readings.None, serviceNumb); 
     if (SensorOK && Initialized != null) Initialized(this); 
    } 

    private bool canInit(object context) 
    { 
     return true; 
    } 

} 

Но проблема в том, что ICommand даже не срабатывает, когда я Нажмите кнопку. Где проблема в этом случае?.

+0

Является ли 'GetAccValues' вашей моделью? Его очень мало, если это так. Установлено ли это свойство 'DataContext' представления? – BradleyDotNET

+0

Да. Я где-то читал, что могу упростить использование объекта DelegateCommand, чем RelayCommand. Возможно, это может быть проблема. Я не знал, что при использовании команд DataContext необходимо установить определенный класс. – user3812509

+0

Как вы ожидаете, что кнопка «найдет» ваш класс? Единственное, что может увидеть XAML, это {Binding initCommand}, как XAML найдет ваш «конкретный» класс? Вы должны либо установить DataContext/Source/RelativeSource. –

ответ

0

Похоже, что вам не хватает DataContext. В упомянутых вами комментариях GetAccValues - ваш ViewModel. Вы можете установить его в codebehind. Как в ответе NSFW. Только установите его в экземпляр вашего ViewModel, а не на сам вид.

Или, вы можете сделать это в XAML:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:AccTestApp" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.DataContext> 
    <local:GetAccValues/> 
</Window.DataContext> 

После этого, установите контрольную точку в поглотителе вашего initCommand, чтобы убедиться, что он вызывается. Он должен быть инициализирован при создании окна.

Если это работает, вы можете сделать связь между View и ViewModel еще менее связанной, установив контекст данных в ресурсах приложения и использовать его только как статический ресурс в вашем представлении. Вы можете найти подробности этого подхода здесь: https://stackoverflow.com/a/4590558/3330348

0

Выражение привязки указывает пользовательскому интерфейсу искать свойства в DataContext формы.

Чтобы получить результаты, которые вы хотите, вы должны сделать это в конструкторе:

public AccView() 
 
{ 
 
    this.DataContext = this; 
 
}

Это говорит о времени выполнения взглянуть на экземпляр AccView, когда он вычисляет выражение привязки ,

Смежные вопросы