Отображение согласованного значения элемента с использованием MVVM и WPF - PullRequest
1 голос
/ 14 июня 2010

В моем элементе управления представлением списка (или любом другом элементе управления WPF, который будет соответствовать ситуации) я хотел бы иметь один TextBlock, который остается согласованным для всех элементов, в то время как другой TextBlock, который изменяется в зависимости от значения в ObservableCollection.Вот как мой код в настоящее время выложен:

XAML

       <ListView ItemsSource="{Binding Path=MyItems, Mode=TwoWay}">      
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock x:Name="StrVal" Text="{Binding StrVal}" />         
                        <TextBlock x:Name="ConstVal" Text="{Binding MyVM.ConstVal, Mode=TwoWay}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Модель

 public class MyItem
    {
        public string StrVal { get; set; }        
    }

ViewModel

public MyVM()
{

    ObservableCollection<MyItem> myItems = new ObservableCollection<MyItem>();
    for (int i = 0 ; i < 10; i++)            
        myItems.Add(new MyItem { StrVal = i.ToString()});

    MyItems = myItems;
    ConstVal = "1";
}

private string _constVal;
public string ConstVal
{
    get
    {
        return _constVal;
    }
    set
    {
        _constVal = value;
        OnPropertyChanged("ConstVal");
    }
}
public ObservableCollection<MyItem> MyItems { get; set; }

public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string item)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(item));
    }
}

}

Код позади

this.DataContext = new MyVM();

Свойство StrVal правильно повторяется в ListView, но ConstValTextBlock не показывает ConstVal, который содержится в VM.Я предполагаю, что это потому, что ItemsSource объекта ListView - это MyItems, и я не могу ссылаться на другие переменные вне того, что содержится в MyItems.

Мой вопрос: как заставить ConstVal отображать значение в ViewModel для всех элементов списка, которые будут контролироваться Наблюдаемой коллекцией MyItems.

1 Ответ

1 голос
/ 14 июня 2010

Есть два способа сделать это.

1) вы можете назвать usercontrol, в котором вы находитесь (x: Name = control или что-то еще), а затем сделать.

<TextBlock x:Name="ConstVal" Text="{Binding ElementName=control, Path= DataContext.ConstVal, Mode=TwoWay}" />

2) используйте относительный источник:

    <TextBlock x:Name="ConstVal" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.ConstVal, Mode=TwoWay}" />

EDIT:

3) Из-за того, как вы вкладываете свои элементы (т. Е. Без введения новых данных, вы можете просто сделать:

<TextBlock x:Name="ConstVal" Text="{Binding Path=DataContext.ConstVal, Mode=TwoWay}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...