M-V-VM WPF: способ поддержания привязки данных при передаче родительского объекта объекта привязки данных в IValueConverter? - PullRequest
1 голос
/ 23 декабря 2009

Я использую модель-вид-вид-модель. В настоящее время у меня есть класс с 3 частями данных: 2 целыми числами и перечислением.

Его конструктор выглядит так:

//C#
public Outcome(OutcomeEnum outcomeEnum, Int32 acutalOutcomeData, Int32 expectedOutcomeData)
{
  m_outcomeEnum = outcomeEnum;
  m_actualData = acutalOutcomeData;
  m_expectedData = expectedOutcomeData;
}

У меня есть 2 ComboBox рядом друг с другом, которые я связал с одним списком объектов результатов (List<Outcome>), которые я использую для "фактических" и "ожидаемых" целочисленных значений.

Этот раздел кода выглядит следующим образом: (SelectedItem и ItemsSource являются свойствами зависимостей в модели представления)

<ComboBox ItemsSource="{Binding Path=OutcomeList}" SelectedItem="{Binding SelectedExpectedOutcome, Mode=TwoWay}" x:Name="PART_cbExpectedOutcome" Grid.Column="1" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Label Content="{Binding Path=ExpectedOutcomeData, Converter={StaticResource OutcomeDataToStringConverter}, ConverterParameter=Expected }" />  
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
<ComboBox ItemsSource="{Binding Path=OutcomeList}" SelectedItem="{Binding SelectedActualOutcome, Mode=TwoWay}" x:Name="PART_cbActualOutcome" Grid.Column="2" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Label Content="{Binding Path=ActualOutcomeData, Converter={StaticResource OutcomeDataToStringConverter}, ConverterParameter=Actual}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Моя проблема: Я хотел бы передать ссылку на объект Outcome в IValueConverter, который я использую для преобразования между ними, но это невозможно с использованием IConvertParameter, а скорее я будет вынужден использовать Multibinding для сообщения msdn здесь .

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

Я хотел бы сделать только одну вещь с объектом Outcome, которую я стремлюсь передать в IValueConverter, - определить тип перечисления OutcomeEnum, чтобы я мог обеспечить правильное форматирование ожидаемого или фактического значения данных.

Есть ли какой-нибудь более простой способ для меня, чтобы иметь возможность передавать объект Outcome в IValueConverter OutcomeDataToStringConverter при сохранении двусторонней привязки с этим списком объектов Outcome? Я открыт для предложений.

Ответы [ 2 ]

1 голос
/ 23 декабря 2009

Почему бы вам не связать весь объект Outcome вместо его свойств ActualOutcomeData или ExpectedOutcomeData? Таким образом, преобразователь получит весь объект Outcome, и на основании него и параметра преобразователя вернет правильное значение.

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <Label Content="{Binding Converter={StaticResource OutcomeToStringConverter}, ConverterParameter=Expected}"/>
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>
0 голосов
/ 23 декабря 2009

На данный момент я закончил тем, что изменил класс Outcome, чтобы у него был только один член - resultData

Затем я создал два списка объектов Outcome, которые были связаны с ItemsSource в выпадающем списке - ActualOutcomeList и ExpectedOutcomeList.

Затем я могу связать сам объект Outcome с Combobox, но имея два списка, я избегаю проблемы дублирования выбора, которую я описываю в комментарии к посту Avaid.

В конце код выглядит так:

    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Label Content="{Binding Converter={StaticResource OutcomeToStringConverter}}" />  
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>

</ComboBox>

<ComboBox 
    x:Name="PART_cbActualOutcome" 
    Grid.Column="2"
    ItemsSource="{Binding Path=ActualOutcomeList}"
    SelectedItem="{Binding SelectedActualOutcome, Mode=TwoWay}"
    IsEnabled="{Binding Path=IsOutcomeEnabled}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Label Content="{Binding Converter={StaticResource OutcomeToStringConverter}}" />

            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
...