Как лучше связывать свойство IsEnabled для кнопки с выбранным элементом в сетке данных? - PullRequest
0 голосов
/ 06 ноября 2010

У меня есть Сетка данных и много кнопок для команд для выбранного элемента в сетке данных.

Эти кнопки будут скрыты или отключены в зависимости от свойств выбранного элемента в сетке.

Например: если выбранная запись является новой, кнопка Отмена будет отключена.

Как лучше всего реализовывать такую ​​ситуацию?

Я могу реализовать ее вручную в SelectedItemChange, как показано ниже:

void myGrid_selectedItemChanged(sender, args..)
{
    cancelButton.IsEnabled = SelectedItem.IsNew ; // just an example
}

Проблема с этим подходом заключается в том, что, когдаЕсли выбранный элемент удален, это событие не будет запущено.

Или в XAML свяжите свойство зависимостей с элементом управления:

<!--SelectedItemIsNew is a property in the form and binding it with IsEnabled... -->
<Button x:Name="cancelButton" IsEnabled="{Binding SelectedItemIsNew ...}"/>

Проблема здесь, я должен присвоить значение длясвойство для уведомления привязанного элемента управления, или, другими словами, какой здесь код для изменения значения свойства?

Другой вариант!

Ответы [ 3 ]

1 голос
/ 06 ноября 2010

Реализация MVVM будет выглядеть примерно так ...

Просмотреть код модели:

public class ParentViewModel : ViewModel
{
    private readonly ICommand cancelCommand;
    private readonly ICollection<ChildViewModel> children;
    private ChildViewModel selectedChild;

    public ParentViewModel()
    {
        this.cancelCommand = new DelegateCommand(this.OnCancel, this.CanCancel);
        this.children = new ObservableCollection<ChildViewModel>();
    }

    public ICommand CancelCommand
    {
        get { return this.cancelCommand; }
    }

    public ICollection<ChildViewModel> Children
    {
        get { return this.children; }
    }

    public ChildViewModel SelectedChild
    {
        get { return this.selectedChild; }
        set
        {
            if (this.selectedChild != value)
            {
                this.selectedChild = value;
                this.OnPropertyChanged(() => this.SelectedChild);
            }
        }
    }

    private void OnCancel(object parameter)
    {
        // cancel logic here
    }

    private bool CanCancel(object parameter)
    {
        // can only cancel if there's a child selected
        return this.SelectedChild != null;
    }
}

XAML:

<GridView ItemsSource="{Binding Children}" SelectedItem="{Binding SelectedChild}">
    ...
</GridView>

...

<Button Command="{Binding CancelCommand}" Content="Cancel"/>
1 голос
/ 06 ноября 2010

Это должно быть правильно:

<Button x:Name="cancelButton" IsEnabled="{Binding IsNew, Source=SelectedItem}"/>

Вопрос в том, где находится ваш SelectedItem? Это свойство DataContext, или свойство вашего элемента управления (или некоторого списка внутри вашего элемента управления)?

Edit:
Для свойства Control должно выполняться следующее:

<Button x:Name="cancelButton"
        IsEnabled="{Binding SelectedItem.IsNew,
                            RelativeSource={RelativeSource FindAncestor, AncestorType=local:MyControl}}"/>
0 голосов
/ 06 ноября 2010

эй, некоторое время назад у меня был такой же случай, я всегда так делаю, когда связываю некоторые данные с сеткой или списком в SL / WPF, так как это легко и более понятно.почему вы не пытаетесь связать список кустома с вашим кодом?Например, возьмите и подайте, как, скажем, String HyperLinkNaviagtion

, когда вы получите значения для службы, а затем для назначения списка вашей сетке, выполните итерацию по всем вашим элементам и присвойте HyperLinkNaviagtion некоторое значение, например

 if(SomeCondition)
    { 
      // navigaet to google
          HyperLinkNaviagtion ="www.google.com";
    } 
 else 
   { 
     // navigaet to yahoo
       HyperLinkNaviagtion ="www.yahoo.com";
   }

и в Xaml выполните следующее

NavigateUri = "{Binding HyperLinkNaviagtion}"

Это Дон, вы можете контролировать почти все, как это =) это может быть не лучшим, нов моем случае это самый простой и без напряжения тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...