Как установить привязку данных в дочернем элементе WPF ItemsControl для использования свойства в контексте родительских данных? - PullRequest
2 голосов
/ 15 июля 2010

У меня есть WPF ListView с коллекцией RadioButtons.Я хочу установить GroupName дочерних элементов управления, которые будут связаны со свойством в родительском контексте данных.В настоящий момент я делаю это, дублируя свойство в каждом контексте данных детей, но это не может быть правильным.

Мой XAML:

 <ListView ItemsSource="{Binding OptionItems}" >
     <ListView.ItemTemplate>
         <DataTemplate DataType="{x:Type Logging:FilterOptionsRadioListViewModel}">
            <RadioButton GroupName="{Binding GroupName}" Content="{Binding Option.Value}" Tag="{Binding Option.Key}" IsChecked="{Binding IsChecked}" Command="Logging:FilterOptionsRadioListViewModel.CheckedChangedCommand" />
         </DataTemplate>
     </ListView.ItemTemplate>
 </ListView>

GroupName является свойствомМодель родительского представления.В настоящее время я передаю это на дочернюю модель представления (где это также свойство) в дочернем конструкторе:

var item = new FilterOptionsRadioListItemViewModel(option, this.GroupName);

Как правильно это сделать?

Ответы [ 3 ]

1 голос
/ 15 июля 2010
 <ListView ItemsSource="{Binding OptionItems}" >
     <ListView.ItemTemplate>
         <DataTemplate DataType="{x:Type Logging:FilterOptionsRadioListViewModel}">
            <RadioButton GroupName="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.GroupName}" Content="{Binding Option.Value}" Tag="{Binding Option.Key}" IsChecked="{Binding IsChecked}" Command="Logging:FilterOptionsRadioListViewModel.CheckedChangedCommand" />
         </DataTemplate>
     </ListView.ItemTemplate>
 </ListView>
0 голосов
/ 15 июля 2010

Если вы назовете свое окно, вы можете пройти через корневой DataContext.

<Window x:Class="MyNamespace.MainWindow"
        Name="Window"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="MainWindow" Height="500" Width="725">

<ListView ItemsSource="{Binding OptionItems}" >
     <ListView.ItemTemplate>
         <DataTemplate DataType="{x:Type Logging:FilterOptionsRadioListViewModel}">
            <RadioButton GroupName="{Binding ElementName=Window, Path=DataContext.ParentGroupName}" Content="{Binding Option.Value}" Tag="{Binding Option.Key}" IsChecked="{Binding IsChecked}" Command="Logging:FilterOptionsRadioListViewModel.CheckedChangedCommand" />
         </DataTemplate>
     </ListView.ItemTemplate>
 </ListView>
0 голосов
/ 15 июля 2010

Вы, конечно, можете это сделать, но если вам не нужно копировать GroupName для каждого дочернего экземпляра Option, вы можете вместо этого сделать что-то вроде следующего:

// I'm imagining your viewmodels look something like this
public class ParentViewModel
{
    private ObservableCollection<Option> m_OptionItems;
    public ObservableCollection<Option> OptionItems
    {
        get { return m_OptionItems; }
        set { m_OptionItems = value; }
    }

    private string m_ParentGroupName;
    public string ParentGroupName
    {
        get { return m_ParentGroupName; }
        set
        {
            m_ParentGroupName = value;
        }
    }


}

public class Option
{
    private string m_Value;
    public string Value
    {
        get { return m_Value; }
        set
        {
            m_Value = value;
        }
    }



}

Затем вы можете использоватьотносительное связывание, чтобы вы могли искать дерево элементов управления, чтобы найти правильный текст данных, поэтому вам не нужно копировать ParentGroupName в каждый дочерний экземпляр Option.

...